10

クラス設計でいつフィールドを使用し、いつプロパティを使用するかを明確に説明できる人はいますか?

検討:

public string Name;

または:

private string _Name;
public string Name
{
   get { return _Name; }
   set { _Name = value; }
}

2 番目の方法の方が適切で柔軟であることがわかっているので、通常は 2 番目の方法を使用します。

しかし、なぜ人々が最初の方法を使用するのを見るのでしょうか? 彼らは怠惰なだけですか、それともそれが正しい選択である特定の状況がありますか? それは単に好みの問題ですか?

4

7 に答える 7

15

C# 3.0 では、実際に次のように記述できます。

public string Name {get; set;}

これにより、適切で怠惰になることができます。

一般的に言えば、プロパティを使用すると、適切なカプセル化が得られます。値を設定するか、値を取得するか、またはその両方を許可するかを選択できます。public メンバーを使用すると、そのオプションはありません。

それはおそらく一部の好みであり、チームが迅速で汚いクラス定義を処理する方法を決定する方法の一部ですが、get/set にプロパティを使用すると言えます。

答える

クラス設計でいつ属性を使用し、いつプロパティを使用するかを明確に説明できる人はいますか?

public 属性は絶対に使用しないでください。代わりに常にプロパティを使用する必要があります。より安全で柔軟です。そうは言っても、人々は怠け者であり、 public メンバーを使用するだけです。ただし、C# 3.0 では、より簡潔な構文を使用してプロパティを定義できるため、内なる怠惰を満足させることができます。

タイプpropしてヒット<tab>するだけで、プロパティを追加する手間が省けます。

于 2009-03-13T06:05:39.553 に答える
14

Alan の返信に対する追加情報:

public string Name {get; set;}

と同じです

private string _Name;

public string Name{   
get { return _Name; }   
set { _Name = value; }
}

名前の設定機能を禁止したい場合は、

公開文字列名 {get; プライベートセット;}

于 2009-03-13T06:17:44.830 に答える
3

プロパティはフィールドよりも保守しやすく、セッター/ゲッターにロジックをカプセル化して、実装を非表示にすることができます。

また、リファクタリングも容易になります。

詳しくは:

于 2009-03-13T06:10:09.480 に答える
0

フィールドをパブリックにすると、ユーザーがフィールドに対してやりたいことを何でもできるようになります。予期しない値、無効な値、オーバーフローを引き起こす可能性のある値などを割り当てることができます。

プロパティを使用すると、フィールドへの新しい値の設定を許可するかどうか、値を保存する前に値をマッサージするかどうか、フィールドの値の変更について関係者に通知するかどうかなどを制御できます。また、ゲッターを介して値を返すための同じ考え方. 2.0 以降の .NET Framework では、getter、setter のアクセサーを設定できます。たとえば、ユーザーにフィールドへの読み取りアクセスのみを許可したい場合は、ゲッターをパブリックにしますが、セッターはプライベートまたは保護します。

于 2009-03-13T09:13:54.063 に答える
0

上で定義したようなプロパティは、ゲッターとセッターのように機能します。プロパティを使用する唯一の利点は、アクセス制限のある変数のように扱えることです。

public string Name { get; private set; }

このプロパティはパブリックにアクセスできますが、プライベートにのみ設定できます。(あなたの同意なしに誰かがあなたの名前を変更したくないでしょう!;))

于 2014-05-29T18:03:16.923 に答える
0

プロパティを使用して、セキュリティを制御できます。

public string Foo { protected get; private set; }

プロパティは、イベントを発生させる簡単な方法を提供します:

public string Foo
{
  get { return _foo; }
}
set
{
  bool cancel = false;
  if(BeforeEvent != null) // EventHandler<CancelEventArgs> BeforeEvent
  {
    CancelEventArgs e = new CancelEventArgs();
    BeforeEvent(this, e);
    cancel = e.Cancel;
  }
  if(!cancel)
  {
    _foo = value;
    if(AfterEvent != null) // EventHandler<EventArgs> AfterEvent
    {
      AfterEvent(this, new EventArgs());
    }
  }
}

また、次のようなコードをよく使用します。

string Foo
{
  set
  {
    IsFooSet = value != null;
  }
}

bool IsFooSet
{
  get { return _isFoo; }
  set
  { 
   _isFoo = value;
   if(value) // some event raise or controls on form change
  }
}
于 2009-03-13T08:56:27.333 に答える
0

プロパティを優先する理由が既に示されていることに加えて、System.ComponentModel には、フィールドではなくプロパティでのみ機能するデータ バインディングと変更通知に関連する優れた機能が多数あります。たとえば、PropertyChangedHandler に関するドキュメントを参照してください。

于 2009-03-13T10:44:21.413 に答える