2016-07-17 4 views
-3

(всхлипывая от разочарования)Как избежать NRE при чтении тэга кнопки C#

Как избежать раздражающего 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. И я понимаю, что это место. Но я не понимаю, почему назначение этого значения null для строковой переменной не может быть выполнено ... Ну, я ясно могу, потому что это то, что я сделал в части «Catch» ...: S – Momom0

+2

@ Momom0 Это не то, что вы делаете. Вы сначала вызываете 'ToString()' на нем, и вы не можете вызывать метод по ссылке «null». –

+0

_ «почему присвоение этого нулевого значения строковой переменной не может быть выполнено» _ - ну, вы можете, но не можете попытаться вызвать метод экземпляра на нем. Это не объективно-c – MickyD

ответ

0

Вам необходимо проверить, есть ли tagnull, прежде чем вы назовете метод ToString(). Что-то вроде этого:

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

Если вы используете последнюю версию VS/C#, то вы можете альтернативно использовать новый оператор:

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

Wow ~ это было приятно! Благодаря! Никогда не видел этот синтаксис раньше, но он отлично работает. И, судя по всему, мои другие NRE были порождениями этого. Как только вы решили это, все остальные исчезли! БЛАГОДАРЯ! – Momom0

Смежные вопросы