2009-02-12 73 views
4

快速提問;執行安全演員後,是否總是需要檢查空值?我現在這樣做,但在這樣的情況下:我是否必須在安全演員之後檢查是否爲空?

void button1_Click(object sender, EventArgs e) 
{ 
    Button = sender as Button; 
    if (button != null) // <-- necessary? 
    { 
     // do stuff with 'button' 
    } 
} 

我只是想知道我是不是在想什麼。我每次都習慣性地檢查null,但在這種情況下,我認爲如果非Button對象被連接到只應用於按鈕的處理程序,我寧願崩潰。

編輯:好的,謝謝你們。我只是好奇,如果有一個我失蹤的角度。

回答

2

我同意 - 也許你最好在應用程序崩潰時關閉非按鈕,因爲此處理程序只適用於按鈕。使用正常轉換進行轉換甚至可能比「as」轉換更好,因爲最終會出現InvalidCastException而不是NullReferenceException,這會使問題非常明顯。

2

是的。除非你想,如果你在這個按鈕:)

+0

這是一個比其他任何事情都更好的例子,但似乎沒有一個我錯過的潛在問題。 – 2009-02-12 00:56:26

7

如果你想崩潰,如果非按鈕被通過了,做打電話的東西會導致異常:

var button = (Button)sender; 

注意,它可能仍然是空,如果傳入一個空對象。

2

只有當你想避免可能的NullRefernceExcetion時纔有必要。

6

這將取決於您的代碼合同。

如果你知道肯定不是null,則不需要檢查。您可以引入一個斷言來僅檢查調試模式。我通常只在一次之後檢查null,就好像我之前沒有檢查過一樣,否則我相信我的合同,有時我會使用assert。

var button = sender is Button ? sender as Button 
      : throw new Exception("Not a button"); 

如果您想要一個不同於壞轉換的異常,您可以嘗試類似這樣的操作。再一次,正式的代碼合同會更好。檢查出this庫。

1

答案在您提到「安全演員」時出現問題。如果這意味着什麼,這意味着演員將取得成功。

在這種情況下,最好使用拋出的類型而不是返回null的類型(無需手動檢查),因爲這樣可以更快地找到錯誤的原因。