7

C#では、他の言語よりも簡単な方法でゲッター/セッターを作成できます。

public int FooBar { get; set; }

これにより、直接アドレス指定できない内部プライベート変数が作成され、外部プロパティ「FooBar」を使用して直接アクセスできます。

私の質問は-これが乱用されているのをどのくらいの頻度で見ますか?カプセル化のベストプラクティスに違反する可能性が高いようです。誤解しないでください。私はそれを適切に使用し、読み取り専用の書き込み専用タイプのプロパティに部分的なバリエーションを使用していますが、コードベースの他の作成者からの不快な経験は何ですか?

明確化:意図された乱用の定義は、プライベート変数が適切な場合にそのようなプロパティを作成することです。

4

4 に答える 4

34

私はそれが乱用されているのを見てきました(私の意見では)。特に、開発者が通常次のように書く場合:

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; }
于 2009-07-02T09:33:07.047 に答える
3

フィールドを手動で書かないというだけで「乱用」はありません。いずれにせよ、(フィールドに直接ではなく) プロパティ経由ですべてのアクセスを奨励するのは良いことです!

私が知っている最大の問題は、バイナリ シリアライゼーションに関するもので、バージョンを非互換にすることなく通常のフィールドに戻すのは少し難しいですが、その場合は... 別のシリアライザーを使用してください ;-p

:this()「適切な」読み取り専用のバリアントがあり、構造体で ctor-chainingを使用する必要がなければいいのですが....まあ!

于 2009-07-02T09:31:20.450 に答える
1

悪用は見たことがありません。正直なところ、この構文がどのように悪用される可能性があるのか​​ わからないので、あなたが何を意味するのかよくわかりません.

于 2009-07-02T09:31:35.597 に答える
0

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

一部の開発者がプライベート フィールドの代わりにパブリックの自動プロパティを使用することを意味する場合、これはもちろん間違っており、カプセル化を破ります..

于 2009-07-02T09:33:23.363 に答える