1. ホーム
  2. c#

[解決済み] 読み取り専用のプロパティを実装する方法

2023-02-13 06:39:34

質問

を実装する必要があります。 読み取り専用 プロパティを実装する必要があります。さらに、このプロパティの値はコンストラクタで設定され、変更されることはありません (私は WPF のカスタム ルーティング UI コマンドを公開するクラスを書いていますが、それは重要ではありません)。

私はそれを行うための2つの方法を参照してください。

  1. class MyClass
    {
        public readonly object MyProperty = new object();
    }
    
    
  2. class MyClass
    {
        private readonly object my_property = new object();
        public object MyProperty { get { return my_property; } }
    }
    
    

FxCopのエラーでpublicなメンバ変数を持つべきではないと言われたので、2番目の方法が正しいようです。正しいですか?

この場合、get only propertyとread only memberの違いはあるのでしょうか?

コメント/アドバイス/等ありましたら、よろしくお願いします。

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

C# 6.0では、読み取り専用のオートプロパティが追加されました。

public object MyProperty { get; }

そのため、古いコンパイラをサポートする必要がない場合、読み取り専用のフィールドと同じくらい簡潔なコードで、本当に読み取り専用のプロパティを持つことができます。


バージョン管理。

ソースの互換性だけにこだわるならあまり差はないかと思います。

プロパティを使えば、ライブラリによってコンパイルされたコードを壊すことなく、セッターを持つプロパティに置き換えることができるので、バイナリ互換性には優れていると思います。

規約です。

あなたは慣例に従っています。このように、2つの可能性の違いが比較的小さい場合は、慣習に従うのがよいでしょう。それがあなたに噛み付いて来るかもしれない1つのケースは、反射ベースのコードです。例えば、プロパティエディタ/ビューアのように、フィールドではなくプロパティのみを受け入れるかもしれません。

シリアライズ

フィールドからプロパティに変更すると、おそらく多くのシリアライザが壊れるでしょう。そして、AFAIK XmlSerializer はパブリックプロパティのみをシリアライズし、パブリックフィールドはシリアライズしません。

Autopropertyを使う

もう一つの一般的なバリエーションは、プライベートセッターを持つオートプロパティを使用することです。これは短く、プロパティですが、読み取り専用を強制するものではありません。だから、私は他のものを好む。

読み取り専用フィールドはセルフドキュメント化される

しかし、このフィールドには1つの利点があります。

それは、(リフレクションを除けば)実際にイミュータブルであることが、パブリック・インターフェースを一目見ただけで明らかになることです。一方、プロパティの場合、あなたはただ あなたは は変更できないので、ドキュメントや実装を参照する必要があります。

しかし、正直なところ、私は怠惰なので、アプリケーションコードでは最初のものをかなり頻繁に使用します。ライブラリでは、私は通常、より徹底的で、慣習に従います。