2011-01-25 54 views
3

如果我定義的擴展方法,如這樣的:是否需要從擴展方法拋出NullReferenceException?

static public String ToTitleCase(this string instance, CultureInfo culture) 
{ 
    if (instance == null) 
     throw new NullReferenceException(); 

    if (culture == null) 
     throw new ArgumentNullException("culture"); 

    return culture.TextInfo.ToTitleCase(instance); 
} 

是否有必要爲我檢查字符串實例空,拋出一個空引用異常自己?或者CLR在這種情況下處理擴展方法(如實例方法)併爲我處理檢查/拋出?

我知道擴展方法只是靜態方法的語法糖,也許C#編譯器在編譯時加入了檢查?請說明:)

+2

重複的問題提供了一些有利於ANE和NRE以及其他細節的很好的理由。 – 2011-01-25 10:44:54

回答

23

你應該從來沒有手動拋出NullReferenceException。它只能由框架本身拋出。

在這種情況下,你應該都instancecultureArgumentNullException

static public String ToTitleCase(this string instance, CultureInfo culture) 
{ 
    if (instance == null) 
     throw new ArgumentNullException("instance"); 

    if (culture == null) 
     throw new ArgumentNullException("culture"); 

    return culture.TextInfo.ToTitleCase(instance); 
} 

NullReferenceException documentation

注意,應用程序拋出 ArgumentNullException例外 而非 NullReferenceException這裏討論的例外 。

+5

我不認爲你的「從不」有足夠的重點。 – 2011-01-25 10:23:35

1

它當然不是。然而,「快速失敗」,以及有些人忘記了......「失敗有幫助」。然而,我相信不拋出ArgumentNullException(辯論與NullReferenceException留給其他職位)的原因是有限的,通常與過於聰明有關:-)一個假設的用例可能是IsNullOrEmpty只要它實際上是爲了一個目的,並使代碼更清潔:去追求它。

CLR沒有檢查。就運行時而言,它只是將一個(可能爲null)參數傳遞給一個靜態方法。剩下的就是糖 - 而且這些糖都不涉及加入額外的空檢查 :-)

快樂的編碼。

相關問題