2016-05-10 6 views
2
  • ToString()メソッドをクラスプロパティでオーバーライドする必要があります。
  • 有効な方法は1つだけですか、その両方がありますか?
  • どちらの場合でもそれぞれの方法を使用する必要がありますか?ToString()メソッドをプロパティまたはフィールドでオーバーライドするには?

    public override string ToString() 
    { 
        return String.Format("{0},{1}", this.field1, this.field2); 
        // ..or 
        return String.Format("{0},{1}", this.Property1, this.Property2); 
    } 
    

助けてください?

答えて

1

明らかに、準備した文字列を返す場合は、ToStringメソッドをオーバーライドする必要があります。それはreuirementではありません。

  • どちらの方法もOKですが、プロパティを使用することをお勧めします。これは、戻り値をより詳細に制御できるためです。
2

いずれも許容されます。

しかし、プロパティは一般的に「公開側」として受け入れられますが、フィールドは通常、ほとんどのC#開発者によって「プライベート」とみなされます。

結果として、直接変更されていない内部値に対して.ToString()を呼び出せるようにしたい場合は、フィールドを使用して非公開にしてください。外部で修正されていて、外部で修正された値が.ToString()によって返されている場合は、プロパティを使用してください。

最後に、プロパティ値を返す前にプロパティ値に追加の「ロジック」を追加する必要がある場合は、プロパティのgetterでプロパティを変更できるので、プロパティが優先されます。

+0

これは変更される値とは何が関係していますか?プロパティを使用する実装はgetterのみを使用しているため、プロパティは読み取り専用です。 – juharr

+0

@juharrプロパティがコンストラクタを介して設定され、後で変更されるとどうなりますか?それは期待される行動を変え、野外アプローチ(反射を避ける)では可能ではありません。プロパティは読み込み専用ではない可能性があります。質問には十分な詳細が示されていません。要点は、行動の適切なカプセル化と意図しない副作用の回避に関するものです。それは関連性があるかもしれないし、そうでないかもしれない、それが私がそれを呼び出す理由である。 –

+0

OK、あなたの答えのすべてから、私は両方の方法が実際に可能であることを理解していますが、特殊なケースではどちらを選択するかは、プログラムのクラス機能の手段に完全に依存します。この問題に注目していただきありがとうございます。私はまだ最高の答えに投票することはできません。 – CSharp4eto

0

多くの場合、プロパティフィールドを表します。

// Property1 represent field1 
    public String Property1 { 
    get { 
     if (null == field1) 
     return "[empty]"; // <- more readable 

     return field1; 
    } 
    } 

プロパティは、多くの場合、より読みやすいので、私見、好適である理由です。しかし、フィールドも良い選択です(特に、フィールドを囲むプロパティがない場合)。

0

ゲッターにロジックがいくつか含まれているとします。フィールドの値を使用して結果を計算し、次にプロパティを使用します。あなたのクラスのユーザーとして、私はUIで(私が直接プロパティを使用した場合)、ToString()を使用した場合はスタックトレースで異なる値を見ることに驚くでしょう。

編集:デフォルトでは、クラスは公開または保護されたインスタンスフィールドを提供しません。したがって、機密データや間違ったオブジェクトの状態を公開する可能性があるため、プロパティが使用可能なときにToString()でフィールドを使用しないようにすることをお勧めします。

関連する問題