回答
您可以通過反轉條件減少混亂。
if (lastSelection == null)
{
MessageBox.Show("No Selection Made");
return;
}
lastSelection.changeColor();
哈!那麼,+1顯然:) – overslacked 2010-03-14 03:58:57
雖然我個人真的不喜歡具有功能多return語句,根據防禦性編程我見過,你會捕獲錯誤條件和退出,否則讓任何事情經過:
if(lastSelection == null)
{
MessageBox.Show("No Selection Made");
return;
}
lastSelection.changeColor();
這很難說,我怎麼會在我自己的工作做到這一點,沒有看到整個函數,這屬於
:-)兩位思想同時進入相同的解決方案。你們有更多的評論。 – Bevan 2010-03-14 03:56:57
我試圖確保lastSelection
從不爲空,並且在當前設計中它爲空的情況下指向「空」對象。然後,不需要空檢查。在系統外部設計可能的錯誤總是一個好習慣。
IOW,我會問,代碼中的不雅是如何做空檢查,或者它是否是事實上,在所有都需要空檢查。
可能不需要「空」檢查,但這似乎是UI代碼,如果沒有進行選擇,可能會很好地告訴用戶「沒有選擇」。在這種情況下,即使使用空對象模式,也需要檢查空對象以告知用戶。 – 2010-03-14 04:26:23
@John Saunders:然後我會問,爲什麼要改變顏色的選項甚至存在,如果它不是一個可行的行動 - 在這種情況下,我寧願通過禁用控制/什麼,甚至在它之前阻止行動這段代碼。或者,空對象可以直接或間接地觸發消息框出現(例如:通過對象上的事件連接到顯示框的UI中的代碼,以使空對象不知道UI細節)。 – kyoryu 2010-03-14 04:44:08
@John Saunders :(順便說一句,可能沒有一個可行的選擇來避免空檢查 - 但我肯定會試着去看看是否有一個)。 – kyoryu 2010-03-14 04:46:12
我認爲你的代碼是好的:你首先檢查正常情況下的(lastSelection != null)
然後是異常情況。
我可能只是添加單個修改:
if (lastSelection != null)
{
lastSelection.changeColor();
//your other normal code
}
else
{
MessageBox.Show("No Selection Made");
//return; //no need for this now
}
@Sameh:如果這是該方法中的所有代碼,那麼您的建議將有效。但是如果有10個相同代碼的副本,可能每個人都檢查一個不同的變量爲null,那麼你會怎麼做呢? – 2010-03-14 04:32:38
@John:這是一個很好的觀點,但他的問題似乎很簡單,可以說出我所說的話。 – 2010-03-14 04:48:01
@Sameh:在我看來,他沒有向我們展示他的所有代碼,而且他展示的代碼不是該方法中唯一的代碼。我可能是錯的。 – 2010-03-14 04:49:27
眼看別人都得到了很好的答案,不這樣做:
if (lastSelection == null) goto ERR;
lastSelection.changeColor();
//... possibly more stuff...
return;
ERR:
MessageBox.Show("No Selection Made");
heh。這是很好的建議。要說清楚,當我說我不喜歡多個回報陳述時,我並不是想以任何方式主張gotos! – overslacked 2010-03-14 04:51:02
實踐趕超快寫null首先如下:
if (null == lastSelection)
{
MessageBox.Show("No Selection Made");
return;
}
lastSelection.changeColor();
@ pokrate:「快速趕上」?人,那是C時代的一件神器,當編譯器不會警告你做'if(lastSelection = null)'時。那差不多是二十年前了! – 2010-03-14 05:05:04
@pokrate,如果你不知道,如果你嘗試在if中分配一個變量,你實際上會得到*編譯器錯誤*。我很傷心,這些類型的構造將會全部丟失...... – overslacked 2010-03-14 05:10:37
這是一種新的練習,我已經在幾乎所有的asp.net入門套件和StackOverflow中看到過。我正在使用VS2008,我也看不到任何編譯器警告。 – pokrate 2010-03-14 09:26:17
這還沒有另一種實施方式。
Action _action = (lastSelection != null
?
new Action(lastSelection.changeColor)
:
() => Console.WriteLine("No Selection Made"));
_action.Invoke();
也許有點矯枉過正,但你肯定會有人維護你的代碼撓頭:-)
另外,像這樣的東西,如果有一個機會,lastSelection可能會改變,你應該存儲當前的本地值,或者根據我的響應使用空對象模式。否則,如果lastSelection在'if'和您使用它之間發生變化,您仍然冒着空引用異常。 – kyoryu 2010-03-14 06:36:08