1

簡単な質問があります。私はC#クラスを設計しました。そこでは、パフォーマンスの高いタスクを実行する責任を負ういくつかのプロパティゲッターを取得しました。私のクラスにはそのようなプロパティがたくさんあります。私の質問ですが、これらのプロパティゲッターは、クラスのインスタンスがメモリに読み込まれるとすぐに評価されますか?もしそうなら、私はそれらをメソッドに分割することを検討します。初めて物件を利用した際にのみ評価していただければ幸いですが、その前提については必ず確認する必要があります。

高価なタスクにはメソッドを使用する必要があることはわかっていますが、クラスに多数のメンバーがいる場合は、プロパティを使用する方が保守しやすいことがわかりました。

ありがとう。

4

5 に答える 5

6

プロパティゲッター/セッターは、それらへの/からのすべての呼び出しに対して評価されます。それらはメソッドの構文にすぎません。

public class Foo
{
   private int actual = 0;
   public int Bar
   {
      get { return actual++; }
      set { value = actual; value++ }
   }
}

int v = foo.Bar; //0
v = foo.Bar; // 1
v = foo.Bar; // 2
foo.Bar = v; // actual = 3
于 2012-05-09T00:29:42.707 に答える
3

ゲッター/セッターはプロパティを呼び出したときにのみ実行されるため、プロパティゲッターはインスタンス化用ではありません。プロパティをインスタンス化するためにコンストラクターを使用します。このルールの例外は、(通常は読み取り専用の)プロパティの値が最初にアクセスされたときに初期化される、遅延初期化です。

于 2012-05-09T00:33:30.447 に答える
3

いいえ、クラスがインスタンス化されたときに評価されません。それらは、アクセスされたとき(およびその後は毎回)にのみ評価されます。これにより、「遅延読み込み」で実装できます。一度評価した後、結果をプライベートフィールドに保存し、その後の呼び出しごとにその結果を返すことが賢明な場合があります(状況によって異なります)。

private string foo;
public string Foo
{
  get
  { 
    if (foo == null)
      foo = "expensive operation";
    return foo;
  }
}
于 2012-05-09T00:33:32.973 に答える
1

ゲッター/セッターは、呼び出すときに評価されます。このことを考慮:

    private string sample;
    public  string Sample
    {
        get
        {
            return (sample = sample ?? SomeExpensiveMethod());
        }
    }

このようにして、高価なメソッドをいつ呼び出すかを制御できます。

また、静的プロパティは、アプリケーションの存続期間中に1回だけ入力されることを考慮してください。したがって、シナリオによっては、それも選択になります。

于 2012-05-09T00:34:27.787 に答える
0

キーワード「value」を使用して、割り当てられる値を評価することもできます。例えば:

public String Author
    {
        get { return author; } 
        set 
        {
            if (value.Equals(""))
                Console.WriteLine();
            else
                author = value; 
        }
    }

このようにして、割り当てを評価できます。

于 2017-03-28T11:37:37.723 に答える