Почему LazyInit <T>ограничен ссылочными типами - PullRequest
0 голосов
/ 07 ноября 2008

У меня есть приложение для обработки данных псевдо-реального времени, в котором я хотел бы использовать LazyInit<double>, поэтому я не делаю нужных мне вычислений, но LazyInit<T> ограничивает T классами. Я могу обойти это, но я бы предпочел не делать этого.

Кто-нибудь знает, почему это так?

Ответы [ 3 ]

4 голосов
/ 29 декабря 2008

Наши текущие (предварительные) биты предоставляют только тип LazyInit, и, как вы заметили (и JaredPar правильно диагностировал), мы ограничиваем T ссылочными типами, чтобы мы могли: (i) сделать LazyInit структурой и (ii) предоставить разумный поведение по умолчанию через CMPXCHG (т. е. мы можем проверить, чтобы 'null' означал отсутствие значения). Мы могли бы сделать T неограниченным, но решили оптимизировать его для общего случая - иначе было бы несколько дополнительных байтов; хотите верьте, хотите нет, но это могло бы сделать тип слишком дорогим для некоторых людей.

Мы недавно немного изменили курс. В настоящее время мы планируем предложить тип LazyInit, где T неограниченно в дополнение к типу LazyInitField, где T ограничен ссылочными типами. Первое - это то, что будет использовать большинство людей, но последнее может быть использовано для тех, кто сознателен и может жить с ограничением на T.

Надеюсь, это прояснит ситуацию. Cheers,

--- Джо Даффи, PFX Dev Lead

2 голосов
/ 07 ноября 2008

Причина, по которой в LazyInit выбран API-интерфейс для андерлинга. Он использует Interlocked.CompareExchange для того, чтобы сделать потокобезопасный набор значений. CompareExchange, в то время как generic ограничено, использует только типы классов. Поэтому значение T для LazyInit также должно быть классом.

Вы можете посмотреть реализацию здесь: LazyInit

0 голосов
/ 07 ноября 2008

Я считаю, что это потому, что типы значений автоматически инициализируются, и LazyInit определяет, нужно ли что-то инициализировать, основываясь на том, является ли оно пустым или нет. Вы можете обойти это, используя обнуляемые типы.

LazyInit<double?>
...