どのくらいの頻度は、C#の速記ゲッター/セッターの乱用を見ていますか?
-
21-08-2019 - |
質問
C#では、あなたは他の言語よりも簡単な方法でゲッター/セッターを作成することができます:
public int FooBar { get; set; }
これは、あなたが直接それにアクセスするために外部のプロパティ「FooBarの」で、直接アドレス指定することはできません内部のプライベート変数を作成します。
私の質問は - どのくらいの頻度で、この虐待を見ていますか?それは多くの場合、カプセル化のベストプラクティスに違反する高いポテンシャルを持っているように思えます。誤解しないでください、私はあなたのコードベースに他の著者からそれをあなたの不快な経験を必要に応じてそれを使用すると、プロパティの読み取り専用書き込み専用タイプのため、それを部分的に変動はなく、何ですか?
の の明確化:虐待の意図した定義は確かにプライベート変数が適切であるような性質を作成することでしょう。のの
解決
私はそれが(私の意見では)虐待さ見てきました。特に、開発者は、の通常の記述します:
private readonly int foo;
public int Foo
{
get
{
return foo;
}
}
彼らは時々書きます:
public int Foo { get; private set; }
はい、それは短いです。はい、クラスの外からそれは同じ外観を持っている - しかし、後者の形式は、プロパティが、同じクラスの別の場所で設定することができますように私は、同じものとしてこれらを表示しません。また、プロパティは、コンストラクタで設定されていない、とフィールドがCLRのために読み取り専用ではありません場合は警告をありませんことを意味します。これらは微妙な違いですが、ちょうどそれが簡単ですので、二番目の形式のために行くとの違いを無視することは、マイナーだ場合でも、私に虐待のように感じます。
幸いなことに、これは現在、C#6のとして入手可能である:
// Foo can only be set in the constructor, which corresponds to a direct field set
public int Foo { get; }
他のヒント
単に手動でフィールドを書いていないではない「虐待」はありません。そして、それはプロパティを通じてすべてのアクセスを(直接ではなく、フィールドへの)奨励するために良いですとにかく!
私の知っている最大の問題は、バイナリシリアル、それがバージョン互換性がない、それをせずに戻って通常のフィールドに変更するには少しトリッキー取得します - しかし、その後...異なるシリアライザ;-pを使用する
「適切な」読み取り専用バリアントがあった場合は、それはいいだろう、とあなたは:this()
のMEH ....構造体にctorのはチェインが、使用する必要はありませんでした場合は!
私はそれのいずれかの乱用を見ていません。そして、正直に言うと、私は本当に私はこの構文が悪用される可能性がどのように見ることができないとして、あなたは、何を意味するかが表示されません。
私は自動プロパティをカプセル化に関しては、通常のプロパティよりも任意の悪化しているとは思わない。
あなたには、いくつかの開発者ではなく、公共の自動プロパティprivateフィールドを使用することを意味している場合、これは、もちろん間違っていると休憩カプセル化..