2009-11-24 103 views
0

零點如果我有一個數組或泛型列表,甚至一本字典,我想先做一些檢查,看看如果對象是有效的,做我:檢查有關集合的

  1. 檢查null
  2. 只是檢查someCollection.count> 0

不要我檢查null,則檢查次數或檢查次數不夠好,我並不需要先檢查空?

我和OOP和C#的問題經常是知道什麼時候檢查空值而只是依賴收集。如果它爲空,那麼如果返回null,並且說你試圖通過屬性返回一個itemin集合作爲示例,那麼返回什麼。

回答

1

您無法檢查空集合上的Count。

空集合和空集合是兩個不同的東西。所以你應該檢查兩者,否則總是初始化你的集合,所以你永遠不會遇到空問題。或者,對於簡單的解決方案,只需返回一個新的集合,然後讓您的調用代碼處理計數檢查。

List<Type> someCollection = new List<Type(); 

if(someCollection == null) 
    return new List<Type>(); 
+0

那麼如果這個調用代碼是在你的標記?我不想在我的標記中使用一堆邏輯來進行計數檢查等,但引用此屬性的方法需要返回對象,無論它是否爲空。如何處理這是我的痛點。 – PositiveGuy 2009-11-24 22:53:39

+0

你是說你的財產需要支持領域?然後正是我所建議的,並將後臺字段初始化爲列表的新實例。 – Brandon 2009-11-24 23:12:29

1

計數不適用於空對象。

下面是一些鍋爐板代碼,你可以使用:

Debug.Assert(collection != null); 
Debug.Assert(collection.Count > 0); 
if (collection == null) { 
    throw new ArgumentNullException("collection"); 
} 
if (collection.Count == 0) { 
    throw new ArgumentException("collection should have at least one member"); 
} 

斷言是非常重要的,應該被更多的.Net開發者來實現。

早期編譯可能是編寫健壯代碼的關鍵。如果有任何參數表示您正在編寫的方法不應被傳遞,那麼最好在此時崩潰,而不是將損壞的數據寫入數據庫。

您還需要一個健壯的日誌記錄機制,以便您記錄所有正在發生的令人討厭的事情。

+0

斷言用於檢查必須爲真的條件,所以在驗證這樣的公共方法的參數時並不是非常有用。 – Lee 2009-11-24 22:09:30

+0

你是說公共方法沒有必須是真實的先決條件嗎?在編譯發佈時,請記住所有這些斷言消失。它是幫助您在編寫代碼時保持誠實的工具。它迫使調試器嘮叨你。 – 2009-11-24 22:15:12

+0

該方法的先決條件是通過在此處拋出異常來強制執行的,因此斷言是多餘的。然而,我總體上同意,斷言並未被充分利用。 – Lee 2009-11-24 22:28:46

0

當您控制這些集合的創建時,您可以使您的API更易於使用從不返回null。如果沒有元素,只需返回一個空集合。如果性能是一個問題,您可以創建一個靜態實例並始終返回該實例,或使用EmptyEnumerator

+0

是的,表現是一個問題。我們是一家電子商務網站,每個月可以獲得500,000次獨特點擊率 – PositiveGuy 2009-11-24 22:54:26