2009-07-02 8 views
5

あなたが他の言語よりも簡単な方法でゲッター/セッターを作成することができます。C#の略語getters/settersの濫用はどのくらいの頻度で見られますか? C#ので

public int FooBar { get; set; } 

これは、あなたが直接それにアクセスするために外部のプロパティ「FooBarの」で、直接アドレス指定することはできません内部のプライベート変数を作成します。

私の質問は - どのくらいの頻度で悪用されていますか?カプセル化のベストプラクティスに頻繁に違反する可能性が高いようです。私は間違ってはいけません。私は適切なものとして使用し、読み込み専用の書込み専用のプロパティでは部分的なバリエーションを使用しますが、コードベースの他の作成者からのあなたの不愉快な経験は何ですか?

明確化:私的な変数が適切である場合、悪用の意図された定義は本当にそのようなプロパティを作成していました。

+0

どのように正確に虐待?私が考えることができる唯一の虐待的なことは、メソッドの価値のある仕事を財産に入れていることです。それはかなり軽微です。 – annakata

+1

自動プロパティの使用が適切でないと思われる例を教えてください。 –

+1

@annakata - 自動的に実装されたプロパティでは**できません。 –

答えて

29

私はそれが(私の意見では)虐待されているのを見ました。特に、開発者は通常書き込みます:彼らは、時々書きます

private readonly int foo; 
public int Foo 
{ 
    get 
    { 
     return foo; 
    } 
} 

public int Foo { get; private set; } 

はい、それは短いです。はい、クラス外からは同じ外観を持っていますが、後者のフォームではプロパティを同じクラスの別の場所に設定できるため、これらを同じものとして見ることはできません。プロパティがコンストラクタで設定されておらず、CLRのフィールドが読み取り専用でない場合は、警告が表示されません。これらは微妙な違いですが、第2の形式の方が簡単です。差異を無視すると、たとえそれがマイナーであっても、虐待のように感じます。

幸いなことに、これはC#6のように利用できるようになりました:

// Foo can only be set in the constructor, which corresponds to a direct field set 
public int Foo { get; } 
+0

良い点。 – BengtBe

+0

私はこれもよく見てきましたが、あなたのテイクは面白いです。 –

+0

ローカル変数fooを読み取り専用としてマークしたため、ほとんど同じではありません。読み取り専用の場合は、最初の初期化時と同じように他の場所に設定することはできません。そうでない場合は、同じクラスの別の場所からアクセスできます。 –

3

フィールドを手作業で書くのではなく、「悪用」はありません。とにかく(フィールドに直接ではなく)プロパティを介してすべてのアクセスを奨励することは良いです!

私の知っている最大の問題は、それはそれバージョン非互換にすることなく戻って通常のフィールドに変更するには少しトリッキー取得binary serialization、である - しかし、その後...

;-p異なるシリアライザを使用「適切な」読み取り専用のバリアントがあり、構造体に:this() ctor-chainingを使用する必要がないのであればうれしいですが.... .... meh!

+0

私は同意します。私はプロパティと思う、後で物事を拡張することができます(特に彼らが公開され、あなたが他の誰かがクラスを使うことを期待している場合)。 – Ian

+0

ここでバウンス命令ポインタに従います(;)):自動プロパティでは、バッキングストアにアクセスできません。それがちょっとしたことならば、それに価値を与える方法はありません。ですから、無意味なことになるでしょう... – RCIX

+0

@RCIX:考え方はプライベートセットとして宣言することですが、 '[Readonly]'を使ってこのアクセスを 'readonly'と全く同じように強制します。 –

1

私はそれを悪用していません。正直言って、この構文がどのように悪用されるのかわからないので、あなたが意味することは実際にはわかりません。

0

私は自動プロパティをカプセル化に関しては、通常のプロパティよりも任意の悪化しているとは思いません。

あなたには、いくつかの開発者ではなく、民間分野の公共自動プロパティを使用することを意味している場合、これはもちろん間違っていると、カプセル化を破る...

関連する問題