什麼檢查,如果該值null
的首選方式?C# - 方法無效檢查
比方說,我們有一些實體,它具有的特性,它可以是null
(他們中的一些或所有的人都)。
我希望在運行時檢查這個,如果某些屬性實際上是null
或不。
你會用簡單的Entity.Property != null
檢查在這種情況下,還是會實現特定的方法,比方說像
bool HasProperty() {
return Property != null;
}
你會選擇什麼?爲什麼?
什麼檢查,如果該值null
的首選方式?C# - 方法無效檢查
比方說,我們有一些實體,它具有的特性,它可以是null
(他們中的一些或所有的人都)。
我希望在運行時檢查這個,如果某些屬性實際上是null
或不。
你會用簡單的Entity.Property != null
檢查在這種情況下,還是會實現特定的方法,比方說像
bool HasProperty() {
return Property != null;
}
你會選擇什麼?爲什麼?
爲此可null
屬性值,我喜歡的是做以下
null
Has
和包含其餘原始屬性名稱,用於確定其他屬性是否爲非空null
在本例中是
SomeType Property {
get {
Contract.Requires(HasProperty);
return _property; }
}
bool HasProperty {
get { return _property != null; }
}
背後的原因這是C#沒有描述值是否可以爲null的標準方式。有許多不同的公約和技術可供使用,但根本沒有標準。而不理解值附近的語義會導致錯過null
檢查並最終導致NullReferenceExceptions
。
我發現來表達這種最好的方式是通過增加Has
性當且僅當該屬性可以null
盡在類型本身明確的屬性的null
功能。這不是一個完美的解決方案,但我發現它在大型項目中運行良好。
其他的解決方案我已經試過
Maybe<T>
或Option<T>
類型。這種方法很有效,但我發現我從開發人員那裏得到了很多推動力,這些開發人員從來沒有完成過函數式編程,並且導致完全拒絕這個想法,以支持#1。只是檢查,如果房產本身爲null,則無需創建此方法。屬性實際上只是由編譯器生成的方法。
只有當屬性是自動初始化的時候,我纔會選擇編寫一個單獨的Has*
屬性(即只是得到它可能會導致分配一個空的集合),這會使性能出現差異。如果獲得該房產是便宜的(因爲它應該是;在某些情況下,你只是不能讓它有所作爲,但),不需要多餘的Has方法。
所以沒有了對於一般情況:
public string Foo { get; set; }
但在某些情況下,它可以是一個好主意:
private List<string> someStrings = null;
public List<string> SomeStrings {
get {
if (someStrings == null)
someStrings = new List<string>();
return someStrings;
}
}
public bool HasSomeStrings {
get { return (someStrings != null && someStrings.Count > 0); }
}
我只檢查對null
,因爲每一個可空類型內部做你描述的到底是什麼(但內部的方法被調用的HasValue
代替HasProperty
):
如果房產的東西是不公開的,那麼你就需要一個像HasProperty()的方法。另外,如果以另一種方式實現「無效」,那麼也可以使用HasProperty()方法。
沒有圖案覆蓋此。事實上,你所做的任何嘗試使這個「更容易」都可以被認爲是反模式。
「嘿,不要檢查屬性爲null,則使用IS [屬性名稱]空財產」
哦,不。
空不一定是壞事。我認爲這一切都取決於爲什麼你需要檢查爲空來確定如何你應該檢查它。
這太糟糕了。在這種情況下,`derp.SomeStrings.Count> 0`是唯一正確的解決方案。實際上,您的財產將報告有一些字符串,實際上,它表示該屬性已被訪問至少一次。它沒有說明這個集合是否包含任何字符串。 – Will 2011-02-01 14:47:25
@Will:好吧,我似乎忘記了Has屬性的count測試。你可能剛剛離開並編輯了我所關心的所有內容,但謝謝指出。 – 2011-02-01 17:28:41
呃,我寧願挑剔。幫助保持我的自滿配額。 – Will 2011-02-01 19:53:32