Сравнение с null в дженериках
От: SergASh  
Дата: 31.05.11 07:46
Оценка:
Привет всем!

Есть метод
class MyClass<T>
{
  public void Test( T value )
  {
    if ( value == null )
    {
    
    }
  }
}

Нужно выполнить кусок кода только в том случае, когда значение value совпадает с null для reference-типов. Но T может быть и value-типом и ограничить его нельзя по условию. Можно ли как-то выполнить сравнение без боксинга?

Спасибо.
Re: Default
От: Qbit86 Кипр
Дата: 31.05.11 07:49
Оценка:
Здравствуйте, SergASh, Вы писали:

SAS>Сравнение с null в дженериках


default Keyword in Generic Code.
Глаза у меня добрые, но рубашка — смирительная!
Re[2]: Default
От: SergASh  
Дата: 31.05.11 08:19
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Здравствуйте, SergASh, Вы писали:


SAS>>Сравнение с null в дженериках


Q>default Keyword in Generic Code.


А вопрос прочитать внимательнее? Я же спрашивал про сравнение. Здесь default не поможет, по крайней мере в лоб, он годится только чтобы присвоить значение или вернуть его, а сравнить с default(T) не получится, потому что оператор == не применим.

Авторы стандартной библиотеки, похоже, этим вопросом не озаботились. Тот же Dictionary при вставке проверяет ключ на null через боксинг.
Re: Сравнение с null в дженериках
От: _FRED_ Черногория
Дата: 31.05.11 08:27
Оценка: 10 (4)
Здравствуйте, SergASh, Вы писали:

SAS>Нужно выполнить кусок кода только в том случае, когда значение value совпадает с null для reference-типов. Но T может быть и value-типом и ограничить его нельзя по условию. Можно ли как-то выполнить сравнение без боксинга?


Весь фокус в том, что боксинга не будет. Даже несмотря на
box !!T

в коде. Джит имеет достаточно знаний — он компилирует этот метод в зависимости от дженерик-параметра и достаточно умный, что бы понять, что в случае value type данное условие никогда не выполнится, поэтому в исполняемом коде боксинга не будет. Если вы распространяете Релиз конечно же.
Help will always be given at Hogwarts to those who ask for it.
Re: Сравнение с null в дженериках
От: _MarlboroMan_ Россия  
Дата: 31.05.11 12:05
Оценка:
Здравствуйте, 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))

— сколько программистов надо чтобы заменить сгоревшую лампочку?
— сколько не бери, а лампочку не поменять — проблема аппаратная, программным путем не решается...
Re[2]: Сравнение с null в дженериках
От: _FRED_ Черногория
Дата: 31.05.11 12:59
Оценка:
Здравствуйте, _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.
Re: Сравнение с null в дженериках
От: TK Лес кывт.рф
Дата: 31.05.11 13:19
Оценка:
Здравствуйте, SergASh, Вы писали:

SAS>Нужно выполнить кусок кода только в том случае, когда значение value совпадает с null для reference-типов. Но T может быть и value-типом и ограничить его нельзя по условию. Можно ли как-то выполнить сравнение без боксинга?


Напишите метод Comparer<T>.Default.IsNull(value) в статическом конструкторе проверить тип T и выдать две реализации: для reference типов сравнить с null для value типов вернуть false
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[3]: Default
От: Lloyd Россия  
Дата: 31.05.11 13:28
Оценка:
Здравствуйте, SergASh, Вы писали:

SAS>Авторы стандартной библиотеки, похоже, этим вопросом не озаботились.


EqualityComparer.Default<T> ?
Re[2]: Сравнение с null в дженериках
От: snaphold  
Дата: 31.05.11 15:05
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, SergASh, Вы писали:


SAS>>Нужно выполнить кусок кода только в том случае, когда значение value совпадает с null для reference-типов. Но T может быть и value-типом и ограничить его нельзя по условию. Можно ли как-то выполнить сравнение без боксинга?


_FR> Если вы распространяете Релиз конечно же.


а можно про это поподробней
Re[3]: Сравнение с null в дженериках
От: _FRED_ Черногория
Дата: 31.05.11 15:11
Оценка:
Здравствуйте, 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, удалив за избыточностью блок проверки насовсем


if ( value == null )
{
    
}

??
Re[4]: Сравнение с null в дженериках
От: snaphold  
Дата: 31.05.11 15:24
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, snaphold, Вы писали:


SAS>>>>Нужно выполнить кусок кода только в том случае, когда значение value совпадает с null для reference-типов. Но T может быть и value-типом и ограничить его нельзя по условию. Можно ли как-то выполнить сравнение без боксинга?


_FR>>> Если вы распространяете Релиз конечно же.


S>>а можно про это поподробней


_FR>Смотря, что под "этим" понимается. Если собрать сборку в дебаге, то есть без включённых оптимизаций, то боксинг будет. В релизе, с включёнными оптимизациями ветка с if вообще будет выкинута и боксинга. как следствие, не будет.


_FR>Но, конечно же, всё зависит от используемой виртуальной машины — например, как оно будет под моной не знаю.


а я подумал, что дефолтовое значение референс тайпов отличается в релизе и дебаге
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.