2016-07-17 43 views
-3

(哭訴無奈)標籤閱讀的按鈕C#

你如何避免惱人的NRE在這種情況下如何避免NRE?代碼的輸出是正確的,但我希望擺脫NRE。

背景:

有窗體上的一些按鈕,其中一些代表教室的座位。其他按鈕是不相關的,因爲我只需要座位按鈕,只有座位按鈕具有有價值的標籤。所以,我遍歷所有的按鈕,並閱讀他們的標籤,如果它不是空的,然後保持在列表中的按鈕。其餘的被忽略。

但是,當代碼運行時,NRE會在第四行彈出,即以「try」開頭的行。

foreach (Button seatbutton in this.Controls) 
{ 
    string betta; 
    try { betta = seatbutton.Tag.ToString(); } 
    catch { betta = ""; } 

    if (!string.IsNullOrEmpty(betta)) 
    { 
    seatbuttons.Add(seatbutton); 
    } 
} 

這是在我的代碼這種類型的NRE的最短,最簡單的例子。還有幾個。

我搜索了網頁,大多數回覆都是這樣寫的:「糟糕的編碼習慣造成了這種情況。」

正如你可以告訴的那樣,我對這件事很陌生,甚至沒有時間去建立習慣。你們能幫忙嗎?也許有一些好的編碼習慣的提示?

T_T謝謝!

+0

@MickyD是的!在我問之前我讀了一篇:D。我也明白seatbutton.Tag有時是空的。但我沒有得到的是爲什麼將這個空值分配給一個字符串變量是無法完成的......那麼,我明顯可以,因爲這就是我在「Catch」部分所做的:S – Momom0

+2

@ Momom0這不是你在做什麼。你首先調用'ToString()',並且你不能在'null'引用上調用方法。 –

+0

_「爲什麼將null值賦給字符串變量不能完成」_--當然可以,但是您不能嘗試調用其上的實例方法。這不是客觀的 - c – MickyD

回答

0

在調用ToString()方法之前,您需要檢查tag是否爲null。事情是這樣的:

string betta = seatbutton.Tag == null ? "" : seatbutton.Tag.ToString(); 
if (betta == "") { 
    seatbuttons.Add(seatbutton); 
} 

如果您正在使用最新VS/C#,那麼您也可以使用new運算符:

string betta = seatbutton.Tag?.ToString(); 
if (!string.IsNullOrEmpty(betta)) { 
    seatbuttons.Add(seatbutton); 
} 
+0

哇〜那很好!謝謝!從未見過這種語法,但它完美的作品。顯然,我的其他NRE是這一個的產物。一旦你解決了這個問題,所有其他人都不見了!謝謝! – Momom0