2012-01-31 10 views
5

Ok、簡単な質問です。プロパティゲッターで評価するか、インスタンスを作成するときに評価しますか?

まず、私の懸念はではないと言わざるを得ない。私は、どちらかのオプションや他のパフォーマンスコストが意味をなさないもので、通常のシナリオでは考慮に値するものではないことを完全に認識しています。それは、コーダーの大部分がそれを行う方法に関して、設計基準や好奇心と関係しています。

質問はかなり単純ですので、[OK]を:MagnitudeArgument性質があるフィールドをバックアップしている

public struct Complex : IEquatable<Complex>, IFormattable 
{ 
    readonly double realPart, imaginaryPart, magnitude, argument; 
    readonly static Complex j = new Complex(0, 1); 

    public Complex(double realPart, double imaginaryPart) 
    { 
     this.realPart = realPart; 
     this.imaginaryPart = imaginaryPart; 
     this.magnitude = Math.Sqrt(Math.Pow(realPart, 2) + Math.Pow(imaginaryPart, 2)); 
     this.argument = Math.Atan2(imaginaryPart, realPart); 
    } 

    public double RealPart { get { return this.realPart; } } 
    public double ImaginaryPart { get { return this.imaginaryPart; } } 
    public double Magnitude { get { return this.magnitude; } } 
    public double Argument { get { return this.argument; } } 

    public static Complex J { get { return Complex.j; } } 
    ... 
} 

は、私は次のように実装することができ複素数structを持っていると仮定建設時に評価される。別のオプションは、どちらかのゲッターで対応する値を単純に評価することです。

これを行うための最も推奨される方法は何ですか?標準を持つために任意のオプションを推奨するコーディング標準はありますか?それがない場合は、通常は何が選択されていますか?それとも、私の場合は無関係なパフォーマンスだけに依存していますか?

答えて

1

[BELOW更新:]

はなぜゲッターに評価していないセッターで?私は値が設定されていると評価します。そうすれば、プライベートメソッドで正しい値を使用できます。

デフォルトで設定されていますが、セッターで評価してください。

パフォーマンスの理由から、セッターで評価する必要があります。パフォーマンスが低下するため、頻繁に実行されることはありません。

[UPDATE:] プロパティが読み取り専用の場合は、上記と同じ理由でc'torで評価します(パフォーマンス - 評価は1回のみ行います)。私はあなたがパフォーマンスが問題ではないと言うことを知っていますが、より良いパフォーマンスの方法でそれをしない理由がない場合、それはそうする必要があります。

+2

ええと、コードにはセッターはありません。 – svick

+1

私はあなたに従うことはありません。これは不変型であり、設定子はありません。問題は、コンストラクタ内の対応するフィールドを初期化するオプションを選択し、ゲッターで使用可能にするか、単にバッキングフィールドを持たず、ゲッターで毎回評価することを選択する場合です。 – InBetween

+0

もちろん、 – hofnarwillie

0

C'torは、デフォルト値でメンバーを初期化する必要があります。

getterが呼び出されるたびに評価されるため、コードをgetterに移動すると、パフォーマンスが問題になる可能性があります。

しかし、getterの契約では、それが価値を得ると言われています。ゲッターブロックの計算部分はできるだけ避けてください。

また、汚れた値の使用を避けるようにしてください。 getterでMagnitude(たとえば)を設定し、クラス内で直接アクセスしようとすると、間違った値を使うことになるかもしれません。

したがって、メンバー変数を初期化することについての質問がある場合は、それをc'torで実行してください。それが言語デザイナーによって作成された理由です。

+0

質問はメンバー変数の初期化に関するものではありません。その質問は*必須*であるので* value types *に関しては問題になります。問題は、まずメンバー変数を持つ価値があるかどうかです。 – InBetween

+2

私はゲッターでの計算を避けるべきではないという意見に同意します。特にここのような比較的シンプルなコードの場合は特にそうです。 – svick

+0

@InBetween:はい、メモリが問題でない場合。要件の変更に伴いスケーラビリティが向上します。 – Azodious

1

getterで値を直接計算するほうが読みやすくなっています。Argumentの内容を知りたい場合は、そのコードを見てください。今のようにフィールドに値をキャッシュした場合は、Argumentプロパティ→argumentフィールド→コンストラクタに移動する必要があります。

パフォーマンスが問題であった場合、明らかに、どのオプションが良いかを知る適切な方法はプロファイリングです。しかし、と思ってと書かれているように、フィールドにキャッシュされた値のバージョンは、特に計算値を頻繁に使用しないと、遅くなると思います。 structが常にコピーされ、これらのフィールドがstructを2倍大きくするためです。

+0

読み取り可能なコードは常にプラスです。はい、ゲッターを使ってコードを読みやすくして、簡単に一見して何ができるのか把握します。もちろん、このようなシンプルなタイプでは、これはマイナーな要因かもしれませんが、まだ心に留めておくべきことです。 – InBetween

+0

@svick:このコードだけが考慮されている場合、getterにコードを入れても問題ありません。それを一般的なルールとして考えると、私はそれを好まないでしょう。 – Azodious

関連する問題