2012-02-08 17 views
8

Tak więc, wykonuję wiele operacji na bazach danych w aplikacji - i istnieje kilka możliwych wartości zwracanych przez mój system buforowania. Może zwrócić wartość null, może zwrócić wartość domyślną (typ) lub zwrócić nieprawidłowy obiekt (przez nieprawidłowy obiekt, tzn. Jeden z niepoprawnymi właściwościami/wartościami). Chcę utworzyć metodę rozszerzenia, aby wszystkie te kontrole dla mnie tak:Metoda sprawdzania wartości Null sprawdzająca

public static bool Valid<T> (this T obj) where T: class 
    { 
     if (obj == null) 
      return false; 
     else if (obj == default(T)) 
      return false; 
     //Other class checks here 
     else 
      return true; 
    } 

Problem polega na tym, mój kompilator mówi mi, że if (obj == default(T)) zawsze będzie fałszywa.

Dlaczego tak jest?

+0

Czy zawiera błąd lub ostrzeżenie kompilatora. Nie dostaję żadnego. kompiluje się dobrze. –

+3

@GregB. To prawdopodobnie 'resharper', który daje mu wskazówkę ... – gdoron

+0

@GregB tak, mam resharper. – caesay

Odpowiedz

21

Skoro masz "klasa" ograniczenie (where T: class), default(T) jest zawsze równa null. W oryginalnym poleceniu if masz już to zaznaczenie, więc druga sprawa (obj == default(T)) może nigdy nie być prawdziwa.

0

Pierwsza decyzja, którą należy wykonać, to: Czy T może być wartością typu: int?
Jeśli więc można usunąć

where T: class 

i

if (obj == null) return false; 
else 

Jeśli T jest zawsze rodzajem odniesienia można usunąć

if (obj == null) return false; 
1

Nie jestem pewien, czy są ograniczające do klasy, ponieważ chcesz lub ponieważ czujesz, że musisz. Jeśli to ostatnie, oto sposób na wartość domyślną sprawdzania złożonych i prostych typów:

public static bool Valid<T> (this T obj) 
{ 
    return !EqualityComparer<T>.Default.Equals(obj, default(T)); 
} 

Jeśli wybór ograniczyć ją tylko do klasy było zamierzone lub dla przypadku biznesowego, prosimy zignorować tę sugestię . Inną rzeczą, o której nie można powiedzieć, jest boksowanie typów prostych (chociaż zazwyczaj używam obecnie typów zerowych z pustymi literami, dla których ten kod działa).

Powiązane problemy