1. ホーム
  2. c#

C#でプロパティを一度だけ設定する方法はありますか?

2023-08-02 06:32:27

質問

C#オブジェクトのプロパティを一度だけ設定できるようにする方法を探しています。これを行うためのコードを書くのは簡単ですが、もし存在するならば、私はむしろ標準的なメカニズムを使用したいと思います。

public OneShot<int> SetOnceProperty { get; set; }.

私が実現したいことは、プロパティがまだ設定されていない場合は設定できますが、以前に設定されていた場合は例外を投げるということです。Nullable値のように機能し、設定されているかどうかを確認することができる必要があります。

どのように解決するのですか?

.NET 4.0 の TPL で直接サポートされています。

(編集: 上記の文章は System.Threading.WriteOnce<T> は、当時利用可能だった "preview" ビットに存在しましたが、これは TPL が RTM/GA になる前に消滅したようです)

私の記憶では、それは多くの行ではありません......。

のようなものです。

public sealed class WriteOnce<T>
{
    private T value;
    private bool hasValue;
    public override string ToString()
    {
        return hasValue ? Convert.ToString(value) : "";
    }
    public T Value
    {
        get
        {
            if (!hasValue) throw new InvalidOperationException("Value not set");
            return value;
        }
        set
        {
            if (hasValue) throw new InvalidOperationException("Value already set");
            this.value = value;
            this.hasValue = true;
        }
    }
    public T ValueOrDefault { get { return value; } }

    public static implicit operator T(WriteOnce<T> value) { return value.Value; }
}

では、例えば

readonly WriteOnce<string> name = new WriteOnce<string>();
public WriteOnce<string> Name { get { return name; } }