2008-12-16 104 views
9

我發現這段代碼在Koders檢查C#new()初始化爲null?

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; 
    } 
} 

我想知道,是否有任何可能方式Debug.Assert(serviceProvider != null可能引發?我的印象是new只能被異常中止,在這種情況下,斷言永遠不會到達。

回答

11

這有可能是的ServiceProvider覆蓋!=/==操作符,這樣對於一個無效狀態比較爲空返回true。

反正看起來很奇怪。

+0

的確如此。 * gag * – 2008-12-16 15:09:35

7

我期望「測試空」模式的更多,如果它是一個工廠方法 - 即

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

還有另外一個情況值得了解的,但在這裏不適用(因爲我們知道我們正在創建的類型)... Nullable<T>;這主要是與仿製藥的問題:

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

這覆蓋了here

+1

這兩個有趣的觀點(因此+1),正如你正確地斷言的那樣 - 在這裏不適用。 – 2008-12-16 15:11:27

3

我同意。如果正在使用正常的!=運算符(從Object繼承),則永遠不會發生這種情況。構造函數總是返回一個對象引用,正如你所指出的那樣,如果在構造函數中引發了一個異常,執行點將完全離開該屬性。

我會檢查這段代碼是幹什麼的。當然,構造函數可能會使構造的對象處於不一致的狀態,這大概是應該進行測試的。

如果您的ServiceProvider類實現System.IServiceProvider,您可能需要檢查以確保GetService()不返回null。