2009-08-21 12 views
2

null可能な型の設定と不安定さを追跡する必要があるシナリオがあります。Null可能型へのメソッドの追加

ので、我々はまた、

value.clear(); 

クリア機能が必要になります

int? value 

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

のようなものは、コンセプトは、データが設定された状態で、余分な状態を持っているということです。

NULL(設定)とNULL(設定解除)は異なる意味を持ちます。 そして、大文字と小文字の値(設定されていません)の値が設定されています(最後の場合は意味がありません)。

この問題を解決する方法があります。 私の現在の考えは、ある種の拡張クラスに戻さなければならないということです。

+1

あなたは 'value.HasValue'を探していますか? –

答えて

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

+0

これは、より短い "var wrap = Int.Create(x);"です。私はこれがはるかに良いことを望む。 ここに@JP関数の書き換えがあります。 int? x = null; var wrap = Int。作成(x); そしてクラスの パブリッククラスのInt { プライベートのInt(){ } のpublic static NullableWrapper (int型X?)を作成します { (x)の新しいNullableWrapper を返します。 } } これで、もっと短くすることができます。 –

2

あなたは、拡張メソッドでNULL可能タイプ制御することができます - つまり:あなたは本当に、このようなオブジェクトにオブジェクトそのものを動作の追加を開始するとき、いくつかの点で、しかしなど、

をそれで動作するようにメソッドを追加それが自分のクラスにあるべきであるように感じるようになります。 Nullable<T>は実際にはまだ1つの値なのでいいです。値はnullでもかまいません。それはまだそれ自体の動作を持っていません。

カスタムビヘイビア、フィルタリング、イベントの追跡などを追加する場合は、独自のカスタムタイプを作成することを検討します。

+1

@Bluephlame:また、null可能な 'int'の値を変更する拡張メソッドを作ることはできません(これは良いことです)。 –

+0

私は非常に同意します。 –

2

ここは例です。

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

これは動作しません(秒)。あなたは値の型を拡張メソッドで渡すので、コピーを無効にしています。 –

+0

LOL、誰かが気付く前に幽霊の編集をしたいと思っていました。 – ChaosPandion

関連する問題