2010-03-14 79 views
6

什麼是寫這個優雅的方式?優雅檢查null並退出C#

changeColor()是空隙功能和運行上面的代碼的功能是一個void函數爲好。

+0

另外,像這樣的東西,如果有一個機會,lastSelection可能會改變,你應該存儲當前的本地值,或者根據我的響應使用空對象模式。否則,如果lastSelection在'if'和您使用它之間發生變化,您仍然冒着空引用異常。 – kyoryu 2010-03-14 06:36:08

回答

14

您可以通過反轉條件減少混亂。

if (lastSelection == null) 
{ 
    MessageBox.Show("No Selection Made"); 
    return; 
} 

lastSelection.changeColor(); 
+0

哈!那麼,+1顯然:) – overslacked 2010-03-14 03:58:57

9

雖然我個人真的不喜歡具有功能多return語句,根據防禦性編程我見過,你會捕獲錯誤條件和退出,否則讓任何事情經過:

if(lastSelection == null) 
{ 
    MessageBox.Show("No Selection Made"); 
    return; 
} 

lastSelection.changeColor(); 

這很難說,我怎麼會在我自己的工作做到這一點,沒有看到整個函數,這屬於

+0

:-)兩位思想同時進入相同的解決方案。你們有更多的評論。 – Bevan 2010-03-14 03:56:57

2

我試圖確保lastSelection從不爲空,並且在當前設計中它爲空的情況下指向「空」對象。然後,不需要空檢查。在系統外部設計可能的錯誤總是一個好習慣。

IOW,我會問,代碼中的不雅是如何做空檢查,或者它是否是事實上,在所有都需要空檢查。

+0

可能不需要「空」檢查,但這似乎是UI代碼,如果沒有進行選擇,可能會很好地告訴用戶「沒有選擇」。在這種情況下,即使使用空對象模式,也需要檢查空對象以告知用戶。 – 2010-03-14 04:26:23

+2

@John Saunders:然後我會問,爲什麼要改變顏色的選項甚至存在,如果它不是一個可行的行動 - 在這種情況下,我寧願通過禁用控制/什麼,甚至在它之前阻止行動這段代碼。或者,空對象可以直接或間接地觸發消息框出現(例如:通過對象上的事件連接到顯示框的UI中的代碼,以使空對象不知道UI細節)。 – kyoryu 2010-03-14 04:44:08

+0

@John Saunders :(順便說一句,可能沒有一個可行的選擇來避免空檢查 - 但我肯定會試着去看看是否有一個)。 – kyoryu 2010-03-14 04:46:12

0

我認爲你的代碼是好的:你首先檢查正常情況下的(lastSelection != null)然後是異常情況。

我可能只是添加單個修改:

if (lastSelection != null) 
{ 
    lastSelection.changeColor(); 
    //your other normal code 
} 
else 
{ 
    MessageBox.Show("No Selection Made"); 
    //return; //no need for this now 
} 
+1

@Sameh:如果這是該方法中的所有代碼,那麼您的建議將有效。但是如果有10個相同代碼的副本,可能每個人都檢查一個不同的變量爲null,那麼你會怎麼做呢? – 2010-03-14 04:32:38

+0

@John:這是一個很好的觀點,但他的問題似乎很簡單,可以說出我所說的話。 – 2010-03-14 04:48:01

+0

@Sameh:在我看來,他沒有向我們展示他的所有代碼,而且他展示的代碼不是該方法中唯一的代碼。我可能是錯的。 – 2010-03-14 04:49:27

1

眼看別人都得到了很好的答案,不這樣做

if (lastSelection == null) goto ERR; 
lastSelection.changeColor(); 
//... possibly more stuff... 
return; 
ERR: 
MessageBox.Show("No Selection Made"); 
+1

heh。這是很好的建議。要說清楚,當我說我不喜歡多個回報陳述時,我並不是想以任何方式主張gotos! – overslacked 2010-03-14 04:51:02

0

實踐趕超快寫null首先如下:


if (null == lastSelection) 
{ 
    MessageBox.Show("No Selection Made"); 
    return; 
} 

lastSelection.changeColor(); 
 
+5

@ pokrate:「快速趕上」?人,那是C時代的一件神器,當編譯器不會警告你做'if(lastSelection = null)'時。那差不多是二十年前了! – 2010-03-14 05:05:04

+0

@pokrate,如果你不知道,如果你嘗試在if中分配一個變量,你實際上會得到*編譯器錯誤*。我很傷心,這些類型的構造將會全部丟失...... – overslacked 2010-03-14 05:10:37

+0

這是一種新的練習,我已經在幾乎所有的asp.net入門套件和StackOverflow中看到過。我正在使用VS2008,我也看不到任何編譯器警告。 – pokrate 2010-03-14 09:26:17

1

這還沒有另一種實施方式。

 Action _action = (lastSelection != null 
           ? 
            new Action(lastSelection.changeColor) 
           : 
           () => Console.WriteLine("No Selection Made")); 
     _action.Invoke(); 

也許有點矯枉過正,但你肯定會有人維護你的代碼撓頭:-)

+0

讀這段代碼讓我癢,但癢並不在我的腦海:) – BillW 2010-03-14 08:58:34

+1

這段代碼非常聰明。等等,有什麼不對......我確信*那聰明的是一個四個字母的單詞...... – kyoryu 2010-03-14 10:35:46