[解決済み] 読み取り専用のプロパティを実装する方法
質問
を実装する必要があります。 読み取り専用 プロパティを実装する必要があります。さらに、このプロパティの値はコンストラクタで設定され、変更されることはありません (私は WPF のカスタム ルーティング UI コマンドを公開するクラスを書いていますが、それは重要ではありません)。
私はそれを行うための2つの方法を参照してください。
-
class MyClass { public readonly object MyProperty = new object(); }
-
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つの利点があります。
それは、(リフレクションを除けば)実際にイミュータブルであることが、パブリック・インターフェースを一目見ただけで明らかになることです。一方、プロパティの場合、あなたはただ
あなたは
は変更できないので、ドキュメントや実装を参照する必要があります。
しかし、正直なところ、私は怠惰なので、アプリケーションコードでは最初のものをかなり頻繁に使用します。ライブラリでは、私は通常、より徹底的で、慣習に従います。
関連
-
[解決済み] リフレクションを使用して文字列からプロパティ値を取得する
-
[解決済み] enumを列挙するには
-
[解決済み] intをenumにキャストするにはどうすればよいですか?
-
[解決済み] C#のオートプロパティに初期値を与える最良の方法は何ですか?
-
[解決済み] JavaScriptでオブジェクトのキー/プロパティの数を効率的にカウントする方法
-
[解決済み] List<T>をオブジェクトのプロパティでソートする方法
-
[解決済み] フィールドとプロパティの違いは何ですか?
-
[解決済み] Pythonの@propertyデコレーターはどのように機能するのでしょうか?
-
[解決済み] オブジェクトのプロパティを値でソートする
-
[解決済み] 変数を使用してオブジェクトのプロパティに動的にアクセスする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み] [Entity Framework 4.1でエンティティに関連オブジェクトを追加する際に、エンティティオブジェクトをIEntityChangeTracker.の複数のインスタンスから参照できない。
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み】ソケットのアドレス(プロトコル/ネットワークアドレス/ポート)は、通常1つしか使用できない?
-
[解決済み】「入力文字列が正しい形式ではありませんでした」エラーの解決方法は?[重複しています]。
-
[解決済み】取り消せないメンバはメソッドのように使えない?
-
[解決済み】"指定されたパスのフォーマットはサポートされていません。"
-
[解決済み】Linq 構文 - 複数列の選択
-
VSでscanfエラーを恒久的に解決するには、ソースファイルを作成し、自動的に#define _CRT_SECURE_NO_WARNINGS 1を追加してください。