2008-11-07 3 views
0

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

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

ответ

2

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

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

0

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

LazyInit<double?> 
+0

Если есть T: ограничение класса, то он не будет удовлетворен типом обнуляемого значения. – 2008-11-07 17:57:48

4

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

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

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

--- Джо Даффи, PFX DEV привести

Смежные вопросы