2010-03-16 3 views
3
public static T IsNull<T>(object value, T defaultValue) 
{ 
    return ((Object.Equals(value,null)) | (Object.Equals(value,DBNull.Value)) ? 
     defaultValue : (T)value); 
} 

public static T IsNull<T>(object value) where T :new() 
{ 
    T defaultvalue = new T(); 
    return IsNull(value, defaultvalue); 
}

Протестировано и может использоваться против объектов данных, классов и переменных. Просто хочу знать, есть ли лучший способ сделать это.Это лучший подход с использованием дженериков для проверки нулей?

+0

Прочитав другие ответы, я смущен. Вы хотите, чтобы этот метод возвращал true/false (мое предположение) или возвращал значение по умолчанию в случае null ptr? – 2010-03-16 15:30:41

ответ

1

[Изменено]

Следующая (не родовое) должен работать.

public static bool IsNull(object value) 
    { 
     return value == null; 
    } 

Любой тип значения будет помещен в коробку (то есть не нуль). Типы ссылок будут просто передаваться указателем.

+0

Вам не нужна обработка типов значений. –

+0

Типы значений не могут быть пустыми. Для этого см. Ответ uvita. – spoulson

+0

Очевидно, что они не могут, но исходный метод OP был общим, этот специфичен для объектов класса. –

8

Похоже, вы пытаетесь дублировать null coalesce operator:

var foo = myPossiblyNullValue ?? defaultValue; 
+1

Мне нравится этот оператор, почти столько же, сколько встроенный, если. – Codesleuth

+1

Это на самом деле лучший способ сделать это. Хотя мы будем сравнивать тип значения с нулевым, если T является структурой или примитивом, он, по крайней мере, дает правильный ответ. –

+0

@Paul Ruane: имейте в виду, что оператор работает только с типами NULL. Нет смысла даже пытаться искать нуль для типа значений, не имеющих значения NULL. – Randolpho

2
public static bool IsNull<T>(object value) 
{ 
    return object == default(T); 
} 
+1

Это вернет true (равно null) для значения по умолчанию для каждого значения, которое явно ошибочно, поскольку эти значения не равны нулю. –

+0

О, извините, пропустил тип возврата. –

+0

Хорошо, теперь, когда я понимаю, как плохо этот вопрос сформулирован, я иду за ответом Конрада Рудольфа. – uvita

5

Во-первых, имя метода неправильно. Вы подразумеваете, что результатом функции является логическое значение, равное true, если заданное значение равно NULL. На самом деле, это не так. GetValueOrDefault может быть лучшим именем.

Во-вторых,, вы просто копируете поведение оператора нулевой коалесценции, как упоминалось другими.

В-третьих, ваш условный нечетное:

Object.Equals(value,null)) | (Object.Equals(value,DBNull.Value) 

Почему Object.Equals вместо ==? Еще лучше, используйте Object.ReferenceEquals, так как это дает понять, что вас интересует эталонное равенство. Кроме того, вы используете побитовый или оператор (|), который семантически ошибочен в этом контексте, хотя и дает правильное значение. Вам нужен логический оператор или оператор ||. (Кроме того, несоответствие: почему вы иногда пишете object и другие времена Object)

Наконец, используя тип object вместо общего типа не обязательно является хорошим решением. Было бы лучше создать перегрузки для общих типов ссылок и значений: это позволяет избежать бокса в типах значений. Это также означает, что вам не нужно явно указывать тип во второй перегрузке, поскольку он может быть выведен из аргумента метода.

+1

Отличный ответ –

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