3

次のコードはクラス内にあることに注意してください単一のクラス

private string _fee;
private string _receipt;

public string Fee
{
    get { return _fee; }
    private set { _fee = value; }
}

public string Receipt
{
    get { return _receipt; }
    private set { _receipt = value;}
}

public MyValue(string fee, string receipt) : this()
{
    _fee = int.Parse(receipt).ToString();
    _receipt = receipt;
}

ご覧のとおり、私のプロパティは何もしないので、使用する必要があります

_fee = int.Parse(fee).ToString();
_receipt = receipt;

また

Fee = int.Parse(fee).ToString();
Receipt = receipt;
4

4 に答える 4

16

プロパティを使用します。C# 3 を使用している場合は、次のように自動的に実装されたプロパティを使用する必要があります。

public string Fee
{
    get; private set;
}

public string Receipt
{
    get; private set;
}

public MyValue(string fee, string receipt) : this()
{
    this.Fee = int.Parse(fee).ToString();
    this.Receipt = receipt;
}
于 2009-08-19T15:56:03.773 に答える
10

私は常にプロパティを使用します。これにより、柔軟性が向上します。

  • 必要に応じて、後でより複雑な getter および setter メソッドを作成できます
  • ゲッターとセッターで異なる可視性を指定できます
  • 必要に応じて、仮想プロパティを定義し、子孫クラスでそれらをオーバーライドできます
  • プロパティに対してデータバインディングを使用できますが、フィールドに対しては使用できません

また、プロパティとフィールドでは .NET リフレクションの動作がわずかに異なるようです。そのため、プロパティとフィールドが混在している場合は、これらの微妙な違いについて知っておく必要があります。プロパティのみを使用する場合は、次のようにします。 -)

クラス内では、バッキング ストア フィールドまたはプロパティのいずれかを使用できます。プロパティを使用すると、セッターが持つ可能性のある副作用 (他のフィールドの更新、呼び出しのログ記録など) が使用されます。バッキングストアフィールドに直接アクセスすると、それらを回避できます。これは良いことも悪いこともあります - シナリオによって異なります。あなたがしていることに注意してください!:-)

マルク

于 2009-08-19T15:53:18.910 に答える
4

この場合、コード全体で一貫性がある限り問題ありません。

ただし、プロパティが としてマークされている場合virtual、コンストラクターでそれらにアクセスすることはお勧めできません。フィールドを直接使用することをお勧めします。これは、プロパティの動作がオーバーライドされる可能性があり、基本クラスが破壊的なコードを呼び出す可能性があるためです。


編集:明確にするために、OPの例のアプローチの違いについて言及しているだけです。marc_s は、プロパティがほとんどの状況で有利になる理由について、いくつかの重要なポイントを示しています。

于 2009-08-19T15:57:25.597 に答える
0

私は常にメンバーを直接使用します。

これは、他のいくつかのフィールドが初期化されていないため、コンストラクター内から正しく実行できないコードをセッターに実装する可能性があるためです。

womp が述べたように、プロパティが仮想の場合はさらに悪化する可能性があります。

于 2009-08-19T16:37:40.290 に答える