2010-05-23 11 views
12

"Domain Oriented N-Layered .NET 4.0 Sample App" projesini inceliyordum ve anlamadığım bazı kodlarla karşılaştım.Nesne null değerine eşit olup olmadığını denetlemeden önce neden boş değer verilir?

public GenericRepository(IQueryableContext context,ITraceManager traceManager) 
{ 
    if (context == (IQueryableContext)null) 
      throw new ArgumentNullException("context", Resources.Messages.exception_ContainerCannotBeNull); 

Neden boş denetleniyor nesnenin türüne boş döküm olacaktır: genellikle null argümanları kontrol etmek için aşağıdaki gibi sözdizimini kullanın Bu projede?

+4

Null'ın null olduğu için hiçbir nedeninin olduğunu sanmıyorum - hiçbir türü yok. Bazılarına uyuyor olabilirler * sadece eşitlik * argümanı için aynı tipteki nesneleri kontrol etmelisiniz, ama bana göre biraz gülünç görünebilir ... –

+2

Belki de okunabilirlik/kendini belgelemek için olduğunu düşünüyorlar mı? – Alan

+0

Bu sınıf alan modelinde nerede? – R0MANARMY

cevap

14

Kullanmanız gereken örnekte anlamsızdır.

bu durumda böyle bir olanak, bazen eklendi (ya da en azından varsayılan (T önce yoktu) boş döküm için ihtiyaç vardır aşağıdaki düşünün:.

void DoSomething(string x) { 
    ... 
} 

void DoSomething(object x) { 
    ... 
} 

DoSomething(null);   // compiler can't infer the type 
DoSomething((string)null); // string type is now explicit 
DoSomething(default(string)); // same as previous 

Edit

Eşitlik testi yapılırken döküm işlemini yapmak zorunda kalacağınız başka bir durum düşünün.Aşırı yüklenmiş bir işleve sahip iki nesneyle karşılaştırmaya izin veren bir işleçiniz varsa, null ile karşılaştırmak belirsiz olacaktır.Ancak IQueryableContext çoğu Muhtemelen bir arabirim ve arabirimler overlo olamaz == işleci adında, verdiğiniz örnekte hala geçerli bir sebep göremiyorum.

class CustomObject { 

    private string _id; 

    public CustomObject(string id) { 
     _id=id; 
    } 

    public static bool operator ==(CustomObject lhs, CustomObject rhs) { 
     if (ReferenceEquals(lhs, rhs)) { return true; } 
     if (ReferenceEquals(lhs, null)) { return false; } 
     if (ReferenceEquals(rhs, null)) { return false; } 
     return lhs._id == rhs._id; 
    } 

    public static bool operator !=(CustomObject lhs, CustomObject rhs) { 
     return !(lhs == rhs); 
    } 

    public static bool operator ==(CustomObject lhs, string rhs) { 
     if (ReferenceEquals(lhs, rhs)) { return true; } 
     if (ReferenceEquals(lhs, null)) { return false; } 
     if (ReferenceEquals(rhs, null)) { return false; } 
     return lhs._id == rhs; 
    } 

    public static bool operator !=(CustomObject lhs, string rhs) { 
     return !(lhs==rhs); 
    } 

} 

CustomObject o = null; 
if (o == null) { 
    Console.WriteLine("I don't compile."); 
} 
+0

Teşekkürler, harika cevap. Bahsettiğim projede, aynı tipteki boş çekimleri de beton tiplerinde kullandıklarını belirtmiştim. –

+1

Ama bunu bir sınıfla yapan herkesin duman canavarı tarafından avlanıp öldürülmesi gerektiğini eklemeliyim. Türü kullanan herkese çok fazla stres ve karışıklık koyardı. – Josh

+1

Sadece başka bir durum: "?:" Koşullu operatörü (veya eski günlerde bildiğim gibi üçlü operatör) kullanırken açık bir boş döküm işlemi de gereklidir. Örnek: DateTime? someVar = 0> 1? DateTime.Now: (DateTime?) Null; – Vinicius

6

Oyuncu yok olmazdım. Bu durumda bunun için bir sebep yok.

+0

Ben de öyle düşündüm. Microsoft destekli bir açık kaynak projesinin en iyi uygulamaları sunmasından bu yana çok tuhaf ve bunun bir anlamı yok gibi görünüyor. –

3

Verilen örnekte hükümsüz kalmanın bir nedeni yoktur. Bu, okunabilirlik için olabilir ... Bilmiyorum, bunu yapmam [P

Bazı durumlarda [bu konuyla ilgili vakaları içermeyen] sizden önce İkiye gidebilir değişkenin boş olup olmadığını kontrol edebilir. Aksi takdirde, object == default (TypeOfObject) ...

İlgili konular