5

Visual Studio 2008 Team System で、C# プロジェクトの 1 つでコード分析を ([分析] メニューから) 実行しました。生成された警告の 1 つは次のとおりです。

Microsoft.Design : フィールド '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 つの質問:

  1. コードに関して、提案が私に何をしてほしいのかを正しく理解しましたか?
  2. なぜ私にこれをさせたいのですか?
4

8 に答える 8

13

はい、正しく理解できたと思いますが、C# の新しいバージョンでは、より簡潔な記述方法があります。

public string Domain { get; set; }

なんで?それはすべてカプセル化に関するものです。示唆されているようにすれば、そのプロパティを使用する呼び出しコードに影響を与えることなく、後で Domain プロパティの定義を変更できます。あなたのクラスは公開されており、おそらくあなたが書いていないコードによって呼び出される可能性があるため、これは潜在的に非常に重要です。

于 2009-11-09T20:06:14.873 に答える
3

これは、将来フィールドをプロパティに変更したい場合、それに依存する他のアセンブリを破壊するためです。

クラスのすべてのコンシューマー (この場合は継承者) を再コンパイルすることなく、将来的に検証やその他のロジックを追加できるように、すべてのフィールドを非公開にしてプロパティにラップすることをお勧めします。

于 2009-11-09T20:06:36.620 に答える
2

うん。それが提案です。直接のインスタンス フィールドとして公開されたプライベートよりも高いアクセシビリティを持たないでください。

これは OOD の主な原則の 1 つであり、カプセル化は「データ隠蔽」とも呼ばれます。

于 2009-11-09T20:06:24.590 に答える
2
  1. はい、問題のコードを賢明に修正しました。
  2. カプセル化についてです。_domainオブジェクトに関するデータです。すべてのクライアントがフィルタリングされずにアクセスできるように直接公開するのではなく、アクセスするためのインターフェイスを提供する必要があります。実際には、これはセッターに検証を追加して、値を設定できないようにする場合があります。API の仕組みを知っているからといって、自分だけがコードを書いているとしたら、ばかげているように思えるかもしれません。しかし、大企業レベルで物事を考えてみてください。オブジェクトがタスクを達成するボックスと見なされるように、API を使用することをお勧めします。そのオブジェクトに検証のようなものを追加する必要はないと言うかもしれませんが、その可能性を保持し、一貫性を保つために、そのように行われます。
于 2009-11-09T20:06:28.117 に答える
2

あなたの翻訳は正しいです。メンバー変数を直接公開する代わりに「パブリック」プロパティを使用する場合と同じ引数を、「保護された」プロパティを使用する場合に使用できます。

これが単純なゲッターとセッターの急増につながるだけなら、コードの読みやすさへのダメージは、将来コードを変更できるという利点を上回ると思います。C# でのコンパイラ生成プロパティの開発では、これはそれほど悪くはありません。次のように使用してください。

protected string Domain { get; set; }
于 2009-11-09T20:08:10.370 に答える
0

ここに記載されている他の回答に加えて、アンダースコアで始まるパブリック/保護されたメンバーはCLS に準拠していません。つまり、.NET 言語がアンダースコアで始まるメンバーをサポートする必要がないため、誰かがクラスから別の方法で継承します。 .NET 言語は、その特定の保護されたメンバーにアクセスできない場合があります。

あなたには当てはまらないかもしれませんが、コード分析の警告の理由の一部かもしれません。

于 2009-11-09T22:05:17.660 に答える
0

あなたの質問に答えて... はい。

ただし、自動プロパティ構文を使用するだけです。

public abstract class Connection
{
    protected string Domain { get; set; }
}
于 2009-11-09T20:09:44.117 に答える