2009-08-21 74 views
2

我們遇到過需要跟蹤可空類型的設置和不安的場景。向可爲空類型添加方法

所以像

int? value 

if(value.isSet()) 
{ 
    addTocollection(); 
} 

,我們還需要一個明確的功能

value.clear(); 

的概念是,數據有一個額外的狀態是設置狀態。

所以NULL(set)和NULL(unset)具有不同的含義。 然後你在大多數情況下的值(集)和值(未設置)(最後這種情況下沒有任何意義)

是有使用擴展方法或可以解決這個問題的一些其它圖案的方式。 我目前的想法是,我們將不得不恢復到某種擴展類。

+1

你在找'value.HasValue'嗎? – 2009-08-21 01:15:20

回答

1

我試圖理解你在做什麼。我認爲它是像下面的東西(轉儲是從LINQPad,只是覺得Console.WriteLine)。總的來說,我認爲這不是一個好主意,因爲你提供了一些晦澀難懂的東西,不能像預期那樣工作。除非我誤解你想要的東西。

void Main() 
{ 
    int? x = null; 
    var wrap = new NullableWrapper<int>(x); 

    wrap.HasBeenSet.Dump(); // false 
    wrap.HasValue.Dump(); // false 

    wrap = 10; 

    wrap.HasBeenSet.Dump(); // true 
    wrap.HasValue.Dump(); // true 
    wrap.Value.Dump();  // 10 

    int? y = wrap; 

    y.HasValue.Dump(); // True 
    y.Value.Dump();  // 10 

    wrap = null; 
    wrap.HasBeenSet.Dump(); // Does now work like expected => bad 
} 

public class NullableWrapper<T> where T : struct 
{ 
    private Nullable<T> _impl; 
    private bool _hasBeenSet = false; 

    public NullableWrapper(Nullable<T> t) 
    { 
    _impl = t; 
    _hasBeenSet = t.HasValue; 
    } 

    public bool HasBeenSet 
    { 
    get { return _hasBeenSet; } 
    } 

    public bool HasValue 
    { 
    get { return _impl.HasValue; } 
    } 

    public T Value 
    { 
    get { return _impl.Value; } 
    set { _impl = value; _hasBeenSet = true; } 
    } 

    public void Clear() 
    { 
    _hasBeenSet = false; 
    } 

    public static implicit operator Nullable<T>(NullableWrapper<T> lhs) 
    { 
    return lhs._impl; 
    } 

    public static implicit operator NullableWrapper<T>(T rhs) 
    { 
    return(new NullableWrapper<T>(rhs)); 
    } 
} 
+0

這實質上就是我想要的,我認爲一個包裝將工作,如果我可以使它容易使用。 例如有沒有什麼辦法可以隱式轉換NullableWrapper等。 NullableWrapper wrap = 123; 而不是= new NullableWrapper (123) – Bluephlame 2009-08-21 02:23:17

+0

這更短「var wrap = Int.Create(x);」我希望這會好得多。 這是對@JP函數的重寫。 int? x = null; var wrap = Int。建立(X); 以及類 公共類詮釋 { 私人INT(){ } 公共靜態NullableWrapper 創建 { 返回新NullableWrapper (X)(INT X?); } } 現在你可以縮短。 – 2009-08-21 03:37:34

2

您可以控制與擴展方法可空類型 - 即:添加方法與它合作等

然而,在某些時候,當你開始添加行爲,像這樣的對象,對象本身真的開始感覺更像它應該在一個自己的階級。 Nullable<T>是很好的,因爲它仍然是一個值 - 只是一個值可以爲null。它本身並沒有行爲。

如果你想添加自定義行爲,篩選,跟蹤等事件,那麼我會考慮爲你自己定製類型。

+1

@Bluephlame:另外,你不能做一個擴展方法來改變可以爲null的int值(這是一件好事)。 – 2009-08-21 01:18:27

+0

我非常同意。 – 2009-08-21 01:20:20

2

這裏是一個例子。

public static class NullableInt32Extensions 
    { 
     public static Boolean IsSet(this Nullable<Int32> value) 
     { 
      return value.HasValue; 
     }  
    } 
+1

這不起作用(第二個)。您在擴展方法中按值傳遞值類型,因此您將複製歸零。 – 2009-08-21 01:20:51

+0

大聲笑,我希望能夠在任何人注意到之前做一個幽靈編輯。 – ChaosPandion 2009-08-21 01:21:33