5

例を挙げると、次のような多くの C# コードを見てきました。

XmlNode n = GetXmlNode();
String[] attributes = new String[n.Attributes.Count];
for (int x = 0; x < n.Attributes.Count; x++)
{
    //do something
}

これが Java の場合、次のようなコードを記述できますが、メソッドを 2 回呼び出すことは罪になります。getAttributes()私の間違いでなければ、同じメソッドを複数回呼び出すのではなく、メソッド呼び出しによって返されたオブジェクトへの参照を保持する変数を宣言し、その変数を必要な回数だけ使用します。

Node n = GetXmlNode();
String[] attributes = new String[n.getAttributes().getLength()];
for (int x = 0; x < n.getAttributes().getLength(); x++)
{
    //do something
}

しかし、C# のプロパティは getter メソッドと setter メソッドが 1 つの型メンバーにカプセル化されているだけなので、同じ規則に従う必要があるのでしょうか?

それとも、標準ライブラリの C# プロパティと Java get メソッドへの呼び出しは、集中的な作業を実行するのではなく、フィールドへの参照を返すだけであると想定するのが「安全」であるため、この場合、ルールは適用されませんか?

4

4 に答える 4

6

計算できるものは保存しないでください。計算できるものを保存すると、計算された値が変更されたときに微妙なバグが発生しますが、保存された値はまだ使用されています。プログラムが遅く、これが遅い最大の理由である場合にのみ、この規則に従わないでください (ヒント: おそらくそうではありません)。

于 2013-02-06T23:08:31.637 に答える
3

プロパティの値を取得するための計算があるかどうかによって異なります(プロパティゲッターでより大きな計算を行うことは悪い習慣だと考えていますが、そのようなプロパティがないことに依存することはできません)。

ルールは次のとおりです。ほとんどの場合、プロパティを複数回呼び出しても問題ありません。...しかし、その方法でそれを行うことができたという理由だけで、そのひどいパフォーマンスキラープロパティを実装したのは誰ですか....

良い- 自動プロパティ

public string MyValueProperty { get; set; }

Java のように getter/setter にコンパイルされます。

private string myValueProperty;
public string MyValueProperty
{
     get{
          return myValueProperty;
     }
     set{
          this.myValueProperty = value;
     }
}

このようなプロパティを複数回呼び出すと、パフォーマンス ヒットはほとんどまたはまったく発生しません。これは、Java での基本的な getter/setter メソッドの呼び出しに似ています。

悪い- プロパティの値を取得するために何らかの計算が必要です

public string MyLongTimeToGetValueProperty
{
     get 
     { 
          var res = DoSomeComputation();
          return res;
     }
}

このようなプロパティを複数回呼び出すことは避けたほうがよいでしょう。(そのような種類のプロパティはメソッドにリファクタリングする必要がありますが、メソッドのように動作するため)

于 2013-02-06T23:18:52.737 に答える
1

返されるコレクションの大きさによっては、時期尚早の最適化と考えます。

コレクションが巨大な場合は、カウントを一度保存​​してから使用してください。そうでなければ..私はそれについてまったく心配しません。

于 2013-02-06T23:07:50.227 に答える
0

可能であれば、最初にアクセスした割り当ての 2 回目に使用してください。

あなたの例では、次のようにコーディングできます。

XmlNode n = GetXmlNode();
String[] attributes = new String[n.Attributes.Count];
for (int x = 0; x < attributes.GetUpperBound(0) + 1; x++)
{
     //do something
}
于 2013-02-06T23:19:45.447 に答える