2008-12-16 8 views
9

Ben Koders Bu kod parçasını bulduk:Null için C# new() ilklendirmesini kontrol ediyor musunuz?

private ServiceProvider SiteServiceProvider 
{ 
    get 
    { 
     if (serviceProvider == null) 
     { 
      serviceProvider = new ServiceProvider(site as VSOLE.IServiceProvider); 
      Debug.Assert(serviceProvider != null, "Unable to get ServiceProvider from site object."); 
     } 
     return serviceProvider; 
    } 
} 

merak ediyorum, Debug.Assert(serviceProvider != null tetikleyebilecek herhangi olası yolu var mı? new'un yalnızca bir istisna tarafından iptal edilebileceği izlenimi altındayım, bu durumda davaya asla ulaşılamaz.

cevap

11

ServiceProvider, geçersiz için null değerini true olarak döndürdüğünü belirtmek için, = = = = = operatörünü geçersiz kılar.

Yine de garip görünüyor.

+0

Çok doğru. * gag * –

7

Ben "Test için null" desen daha eğer bir fabrika yöntemi olduğunu beklenebilir - yani

SomeType provider = SomeFactory.CreateProvider(); 
if(provider == null) // damn!! no factory implementation loaded... 
{ etc } 

Yaklaşık bilerek bir başka vaka değer, ama biz biliyoruz çünkü hangi (burada geçerli değildir oluşturduğumuz tip) ... Nullable<T>; Bu here daha kaplıdır

static void Test<T>() where T : new() 
{ 
    T x = new T(); 
    if (x == null) Console.WriteLine("wtf?"); 
} 
static void Main() 
{ 
    Test<int?>(); 
} 

: Bu esas olarak jenerik bir konudur.

+1

Doğru olarak belirttiğiniz gibi, ilginç noktalar (bu nedenle +1) burada geçerli değildir. –

+0

@David - soru başlığı için geçerli olsa da - neden dahil ettim; --p –

3

Katılıyorum. Eğer normal! = Operatör (Object'ten alınmış) kullanılıyorsa, bu asla gerçekleşemez. Bir kurucu her zaman bir nesne başvurusu döndürür ve belirttiğiniz gibi, kurucuda bir istisna atılmışsa yürütme noktası özelliği tamamen terk eder.

Bu kodun ne amaçla tasarlandığını denetlerim. Kurucu, elbette, inşa edilmiş nesneyi tutarsız bir halde bırakmış olabilir ve bu muhtemelen test edilmesi gereken şeydir.

ServiceProvider sınıfınız System.IServiceProvider uygularsa, GetService() 'nin null döndürmediğinden emin olmak isteyip istemediğinizi kontrol etmek isteyebilirsiniz.

İlgili konular