C# で保護されたフィールドをプライベートに設定し、プロパティを追加します -- なぜですか?
-
19-09-2019 - |
質問
Visual Studio 2008 Team System で、C# プロジェクトの 1 つで ([分析] メニューから) コード分析を実行しました。生成された警告の 1 つは次のとおりです。
Microsoft.デザイン:フィールド「Connection._domain」は宣言型の外部で表示されるため、そのアクセシビリティをプライベートに変更し、そのフィールドへのアクセスを提供するために、フィールドが現在持っているアクセシビリティと同じアクセシビリティを持つプロパティを追加します。
これは次のフィールドを指します。
public abstract class Connection
{
protected string _domain;
}
その提案の背後にある理由がわかりません。これが私にやりたいことだと思います:
public abstract class Connection
{
private string _domain;
protected string Domain { get { return _domain; } set { _domain = value; } }
}
2 つの質問:
- 提案がコード的に何をしたいのかを正しく理解しましたか?
- なぜ私にこれをさせたいのでしょうか?
解決
はい、私はあなたが正しく理解だと思う - C#のそれ以降のバージョンでは、それを書くために、より簡潔な方法はありますけれどもます:
public string Domain { get; set; }
なぜ?これは、すべてのカプセル化についてです。それが示唆するように、あなたが行う場合は、後でそのプロパティを使用するすべての呼び出し元のコードに影響を与えずに、ドメインのプロパティの定義を変更することができます。あなたのクラスが公開されている、と考えられることは、潜在的に非常に重要です、あなたが書いていないコードによって呼び出されることがあります。
ので、他のヒント
うん。それは提案です。あなたは、直接インスタンスフィールドとして公開され、民間よりも高いアクセシビリティを持つべきではありません。
これはOODの主な原則の一つだ - カプセル化はまた、「データ隠蔽」と呼ば
。- はい、問題をコード的に修正しました。
- カプセル化についてです。
_domain
オブジェクトに関するデータです。クライアントがフィルタリングされずにアクセスできるように直接公開するのではなく、クライアントがそれにアクセスするためのインターフェイスを提供する必要があります。実際には、これはセッターに検証を追加して、値を設定できないようにすることかもしれません。API がどのように機能するかを知っているため、自分だけがコードを作成している場合、それは愚かなことのように思えるかもしれません。しかし、大規模な企業レベルで物事を考えてみてください。オブジェクトをタスクを実行するボックスとして見なせるように API を用意する方がよいでしょう。そのオブジェクトに検証のようなものを追加する必要はまったくないと言うかもしれませんが、その可能性を保持し、一貫性を保つために、物事はそのように行われます。
あなたの翻訳が正しいです。 「パブリック」プロパティを使用して代わりの直接メンバ変数を露出させるためにすることができるように「保護」プロパティを使用するために作製することができるため、同じ引数
これは単純なゲッターとセッターの増殖につながる場合には、私は将来的にコードを変更することができるという利点を上回るコード可読性へのダメージを考えます。これはそれほど悪くないですC#でのコンパイラで生成されたプロパティの発展に伴い、ちょうど使用します:
protected string Domain { get; set; }
このです。
それはあなたのクラスのprivateすべてのフィールドを維持し、あなたはすべての消費者(あるいはこの場合の相続での)再コンパイルすることなく、将来的に検証や他のロジックを追加するオプションを持っているような特性でそれらをラップすることをお勧めします。
あなたの質問への答えは...はい。
しかし、私は自動プロパティの構文を使用します:
public abstract class Connection
{
protected string Domain { get; set; }
}
基本的に、特性が部材を返すか、設定以上のものを提供します。彼らはあなたがなど適切な入力フォーマット、範囲の検証を、検証することができロジックを追加することができます。
のリンクから選択した答えは最高の、「プロパティはカプセル化を提供します。あなたがプロパティのコード内の任意の必要な検証/整形/ A変換をencapulateすることができます。これは、フィールドのために行うのは難しいだろう。」それを置きます。
ここで言及した他の回答に加えて、アンダースコアで始まる公開/保護されたメンバーは、= <のhref =「http://msdn.microsoft.com/en-us/library/bhc3fa7f.aspx」のrelではありません「nofollowをnoreferrer」> CLS準拠のは、その中に別の.NET言語であなたのクラスから継承し、誰かがその特定にアクセスすることができない場合がありますので、.NET言語は、先頭のアンダースコアを持つメンバーをサポートするための要件はありません保護されたメンバーます。
私が知っている、それはおそらくあなたには適用されませんが、それはコード解析警告の理由の一部である可能性があります。