class MyClass<T>
{
public void Test( T value )
{
if ( value == null )
{
}
}
}
Нужно выполнить кусок кода только в том случае, когда значение value совпадает с null для reference-типов. Но T может быть и value-типом и ограничить его нельзя по условию. Можно ли как-то выполнить сравнение без боксинга?
Здравствуйте, Qbit86, Вы писали:
Q>Здравствуйте, SergASh, Вы писали:
SAS>>Сравнение с null в дженериках
Q>default Keyword in Generic Code.
А вопрос прочитать внимательнее? Я же спрашивал про сравнение. Здесь default не поможет, по крайней мере в лоб, он годится только чтобы присвоить значение или вернуть его, а сравнить с default(T) не получится, потому что оператор == не применим.
Авторы стандартной библиотеки, похоже, этим вопросом не озаботились. Тот же Dictionary при вставке проверяет ключ на null через боксинг.
Здравствуйте, SergASh, Вы писали:
SAS>Нужно выполнить кусок кода только в том случае, когда значение value совпадает с null для reference-типов. Но T может быть и value-типом и ограничить его нельзя по условию. Можно ли как-то выполнить сравнение без боксинга?
Весь фокус в том, что боксинга не будет. Даже несмотря на
box !!T
в коде. Джит имеет достаточно знаний — он компилирует этот метод в зависимости от дженерик-параметра и достаточно умный, что бы понять, что в случае value type данное условие никогда не выполнится, поэтому в исполняемом коде боксинга не будет. Если вы распространяете Релиз конечно же.
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, SergASh, Вы писали:
SAS>Привет всем!
SAS>Есть метод
SAS>class MyClass<T>
SAS>{
SAS> public void Test( T value )
SAS> {
SAS> if ( value == null )
SAS> {
SAS> }
SAS> }
SAS>}
SAS>
SAS>Нужно выполнить кусок кода только в том случае, когда значение value совпадает с null для reference-типов. Но T может быть и value-типом и ограничить его нельзя по условию. Можно ли как-то выполнить сравнение без боксинга?
SAS>Спасибо.
Equals(value, defaul(T))
— сколько программистов надо чтобы заменить сгоревшую лампочку?
— сколько не бери, а лампочку не поменять — проблема аппаратная, программным путем не решается...
Здравствуйте, _MarlboroMan_, Вы писали:
SAS>>Есть метод
SAS>>class MyClass<T>
SAS>>{
SAS>> public void Test( T value )
SAS>> {
SAS>> if ( value == null )
SAS>> {
SAS>> }
SAS>> }
SAS>>}
SAS>>
SAS>>Нужно выполнить кусок кода только в том случае, когда значение value совпадает с null для reference-типов. Но T может быть и value-типом и ограничить его нельзя по условию. Можно ли как-то выполнить сравнение без боксинга?
_MM_>Equals(value, defaul(T))
Тут результат будет другим — например, в вызове Test(0) у топикстартера if не сработает, а у вас сработает. Да и боксинг всё-равно будет, так как параметры Equals — object.
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, SergASh, Вы писали:
SAS>Нужно выполнить кусок кода только в том случае, когда значение value совпадает с null для reference-типов. Но T может быть и value-типом и ограничить его нельзя по условию. Можно ли как-то выполнить сравнение без боксинга?
Напишите метод Comparer<T>.Default.IsNull(value) в статическом конструкторе проверить тип T и выдать две реализации: для reference типов сравнить с null для value типов вернуть false
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, SergASh, Вы писали:
SAS>>Нужно выполнить кусок кода только в том случае, когда значение value совпадает с null для reference-типов. Но T может быть и value-типом и ограничить его нельзя по условию. Можно ли как-то выполнить сравнение без боксинга?
_FR> Если вы распространяете Релиз конечно же.
Здравствуйте, snaphold, Вы писали:
SAS>>>Нужно выполнить кусок кода только в том случае, когда значение value совпадает с null для reference-типов. Но T может быть и value-типом и ограничить его нельзя по условию. Можно ли как-то выполнить сравнение без боксинга?
_FR>> Если вы распространяете Релиз конечно же.
S>а можно про это поподробней
Смотря, что под "этим" понимается. Если собрать сборку в дебаге, то есть без включённых оптимизаций, то боксинг будет. В релизе, с включёнными оптимизациями ветка с if вообще будет выкинута и боксинга. как следствие, не будет.
Но, конечно же, всё зависит от используемой виртуальной машины — например, как оно будет под моной не знаю.
Help will always be given at Hogwarts to those who ask for it.
Re: Сравнение с null в дженериках
От:
Аноним
Дата:
31.05.11 15:19
Оценка:
Здравствуйте, SergASh, Вы писали:
хм. а когда value тип может быть null?? не соптимизирует ли компилятор при T is ValueType, удалив за избыточностью блок проверки насовсем
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, snaphold, Вы писали:
SAS>>>>Нужно выполнить кусок кода только в том случае, когда значение value совпадает с null для reference-типов. Но T может быть и value-типом и ограничить его нельзя по условию. Можно ли как-то выполнить сравнение без боксинга?
_FR>>> Если вы распространяете Релиз конечно же.
S>>а можно про это поподробней
_FR>Смотря, что под "этим" понимается. Если собрать сборку в дебаге, то есть без включённых оптимизаций, то боксинг будет. В релизе, с включёнными оптимизациями ветка с if вообще будет выкинута и боксинга. как следствие, не будет.
_FR>Но, конечно же, всё зависит от используемой виртуальной машины — например, как оно будет под моной не знаю.
а я подумал, что дефолтовое значение референс тайпов отличается в релизе и дебаге