を行うにはC#の構文はありません。
public struct WriteOnce<T>
{
private T? _value;
public T Value
{
get { return _value; }
set
{
if (_value.HasValue) throw new InvalidOperationException();
_value = value;
}
}
}
編集 私はちょうど上記がコンパイルされないことに気付きました。コンパイラは_valueの型をNullableにすることはできません.T in Nullableはnull不可能な型でなければならないからです。 - それはうまく機能しないことが、私はそれがより良い仕事と述べ
public struct WriteOnce<T>
{
private T _value;
private bool _hasValue;
public bool HasValue { get { return _hasValue; } }
public T Value
{
get { return _value; }
set
{
if (HasValue) throw new InvalidOperationException();
_value = value;
_hasValue = true;
}
}
public static implicit operator T(WriteOnce<T> x)
{
return x.Value;
}
public WriteOnce(T val)
{
_value = val;
_hasValue = true;
}
}
注:
はここで少し良く動作する実装です。
最初に、何かを割り当てずに使用しようとしていることを検出すると、コンパイラはそれに気付きます。そのようにそれを初期化することの世話をします。
WriteOnce<int> foo = default(WriteOnce<int>);
第二に、それは変更に例外をスローした場合でも、C#がまだ喜んであなたがそれを上書きできるようになります。したがって、これは機能の一部をカプセル化しますが、それがオブジェクトのインタフェースで公開されることになる場合、誤用を防ぐためにプロパティにラップする必要があります。
private WriteOnce<int> _someInt = default(WriteOnce<int>);
public int SomeInt
{
get { return _someInt; }
set { _someInt.Value = value; }
}
しかし、それはまだ本当に私が変更可能な構造体を作成したオリジナルのスニペットにコミット最後の悪質なエラーを回避しません。このようなことをたくさんしている場合は、かもしれないは、自分自身を繰り返さないためにその原則に違反する価値がありますが、これは間違いなく慎重にコメントし、公開されているインターフェイスから守らなければならない潜在的な罠です。
しかし、一度限りのものであれば、プロパティを直接実装することについて他の人が示唆していることは、それほど複雑ではなく、より安全です。
この投稿について申し訳ありませんが、私は「外部への注意を払っていませんコンストラクタ "タイトルの一部。 – sergiol