2012-02-28 70 views
7

我有許多具有IsActive屬性的實體。出於內部原因,我需要所有這些字段都是可空的。在另一方面,對於每個實體我可能有數十應用程序的地方做一個雙重考驗:避免重複測試相同屬性上的空值

如果我創建一個方法類似

(空被視爲真)

if (language.IsActive == null || language.IsActive.value) 

class Language 
{ 
    public bool IsActiveLanguage() 
    { 
     return language.IsActive == null || language.IsActive.value; 
    } 
} 

它仍然不會隱藏屬性(從類中至少),所以它很容易出錯。

我試圖找到一種方式來重寫,但我當然可以返回類型不更改爲純bool

在這種情況下,您將如何避免冗餘?

+5

所以在你的情況下null等價於* true *,而不是false?這有點不尋常。 – 2012-02-28 16:46:39

+0

是的,這只是「只要它不是假的,這是真的」。我同意這可能不是最佳做法! – Mathieu 2012-02-28 16:52:11

回答

13

使用GetValueOrDefault方法,指定值來替代使用的null

public bool IsActiveLanguage() 
{ 
    return language.IsActive.GetValueOrDefault(true); 
} 

注:

是否使用CLR方法(GetValueOrDefault)或la nguage操作符(C#中的??,VB中的If(,))對結果沒有影響,它只是代碼一致性問題。就我個人而言,我在想要以相同方式處理可爲空值的類型和字符串的地方使用語言運算符,但在我想強調可空值所發生的事情的地方使用CLR方法。

1

你爲什麼不只是這個隱藏實現細節中,吸氣:

private bool? _IsActive; 
public bool IsActive { get { return !_IsActive.HasValue ||_IsActive; } } 

編輯:實現屬性生成的,無法修改

你可以聲明一個新的類型後,所謂ThreeValBool,這基本上是一個布爾值?然後添加其中的隱式轉換爲bool,像這樣:

struct ThreeValBool 
{ 
    private bool? _value; 

    public static implicit operator bool(ThreeValBool tvb) 
    { 
     return !tvb._value.HasValue || tvb.value; 
    } 
} 

顯然,你需要添加一個方法來設置值...

使你的屬性的類型(希望設計師會讓你這樣做)。

+0

因爲該實現位於.designer.cs文件中。否則,是的,這將是一個很好的解決方案! – Mathieu 2012-02-28 16:49:32

+0

那麼,你可以讓IsActive生成的屬性保密嗎?如果是這樣,你可以添加你的IsReallyActive屬性。 – zmbq 2012-02-28 16:50:38

+0

似乎有點笨重,到處都有。如果這是路線,我會給AOP一點點時間,讓它稍微短一些。將屬性放在IsActive上以覆蓋返回值。同時賦予它重用其他怪異布爾值的能力。 – 2012-02-28 16:50:42

3

如果你的財產是Nullable<>null值意味着true,你可以使用它來代替一個明確的空檢查:

language.IsActive.GetValueOrDefault(true); 
2

很好的答案被給予,我會也許做一個

public static bool IsActive(bool? toCheck) 
{ 
    return toCheck.GetValueOrDefault(true); 
} 

在某些靜態幫助器類上。