2

クラスメソッド/プロパティ内のプライベートフィールドを変更するには、どのシナリオを使用する必要がありますか:

public class Example
{
 private int intVar = 0;
 private string stringVar = string.Empty;

 public int IntVar
 {
  get { return this.intvar; }
  set { this.intvar = value; }
 }

 public string StringVar 
 {
  get { return this.stringVar ; }
  set { this.stringVar = value; }
 }

 private void SomeMethod()
 {
  //change fields in this way:
  this.intVar = 50;
  this.stringVar = "changed";
  //or that way(through properties):
  this.IntVar = 50;
  this.StringVar = "changed";
 }
}

この例ではおそらく違いはありませんが、誰かがプロパティにコードを追加し、プロパティを介してフィールドを変更すると、他のものが変更されるとどうなるでしょうか?

どちらの方法が優れていると言えますか、それとも本当に違いはありませんか?

C# 3.0 から自動実装プロパティを記述できることは知っていますが、これは C# 2.0 です。

4

4 に答える 4

1

intVar の値が 100 を超えたときに Example オブジェクトを無効としてマークするなど、何らかの検証を行う場合は、Properties を使用する必要があります。

public int IntVar
 {
  get { return this.intvar; }
  set 
      { 
         if ( value > 100)
            // handle this corner case
         else      
           this.intvar = value; 
      }
 }

あなたのプライベートメソッドがいくつかの計算を行うとしましょう

private void SomeMethod()
 {
   int result = ...;
   IntVar = result;
 }

SomeMethod が呼び出された場合は、ここでプロパティを使用する方が適切です。フィールドではこれを実行できないため、プロパティが検証を処理します。

于 2012-04-20T09:54:16.563 に答える
1

通常、プロパティを使用する方が良いと思います。ゲッターとセッターが単純な場合は、とにかく実行時にジッターによってインライン化される可能性があります。そして、あなたが言ったように、プロパティコードに他の変更が加えられるかもしれません.

一般的な変更は、INotifyPropertyChanged を実装して変更通知を追加することです。フィールドを直接設定すると、リスナーは通知されません。

私は自分のクラスが内部よりも独自のパブリック インターフェイスを使用することを好みます。私の例外は、明示的に副作用を望まない場合です。しかし、それはめったにありません。

于 2012-04-20T09:52:33.567 に答える
1

私の経験から、常にプロパティを使用し、変数に直接アクセスしようとしないでください。将来、誰かがプロパティアクセサーにコードを追加した場合、その変更の副作用をチェックする責任があります。

そのシナリオでは、テスト作業を容易にします。変更の実装者は、内部変数ではなく、パブリック名のみをチェックする必要があります。

于 2012-04-20T09:52:38.290 に答える
0

それは何の違いもありませんし、個人的な好みです。
プロパティを使用することを好みます。

于 2012-04-20T09:51:50.657 に答える