2017-02-28 5 views
2

私の講師は、プライベートフィールドとパブリックプロパティを使用するように私に指示しました。最近、私はチュートリアルビデオを見ていました。プレゼンターはプロパティのみを作成しました。プロパティを使うだけでいいですか?プライベートフィールドをスキップしてC#でプロパティを使用するだけですか?

+0

プライベートフィールドなしプロパティを使用して、その絶対に罰金であることを再設計する必要があります。これらは自動プロパティと呼ばれます。プライベートフィールドは、プライベートフィールドに値を設定する前と後で、プライベートフィールドの値を返す前に、ゲッターとセッターで余分なロジックを実行する場合に特に便利です。 –

+0

関連:http://stackoverflow.com/q/1277572/380384 – ja72

+1

また、プロパティでこれを行うことができればうれしいです: 'public int MyValue {get;プライベートセット; } '..' MyValue'は、クラス内でのみ設定可能なパブリックプロパティです。 – txtechhelp

答えて

5

パブリック・プロパティは、コンパイラによって自動的にプライベートバッキングフィールドを実装します。あなたはそれらを見ることはありませんが、効果は手動で指定されたバッキングフィールドと同じです。

private string name; 
public string Name { get { return name; } set { name =value; } } 
+1

答えはC#3.0以降** ** –

+0

'C#3.0'です。Visual Studio 2008は廃止されましたので、明確にすることはありませんでした。 .NET 3.5のみに固執するクラスがあるかどうか疑問に思う – ja72

-1

はい、パブリックフィールドを使用するだけで大​​丈夫ではありませんが、プライベートフィールドなしでパブリックプロパティを使用することはできます。これは、後で内部的にフィールドの検証と保存の方法を変更することができるプロパティを使用しているのに対し、パブリックフィールドを変更するだけで、クラスのユーザーが破損するためです。主な違いは、プロパティでは、たとえそれが自動生成フィールドであっても、クラスの内部状態を制御できますが、パブリックフィールドではそうではありません。このよう

public string Name { get; set; } 

として

3

.Net framework 2.0以下では、プライベートフィールドが必要です。そうでない場合、コンパイルエラーが発生します。

.Net Frameworkの上位バージョンでは、エラーなく正常に動作します。プライベートフィールドを使用して

は不正な値https://msdn.microsoft.com/en-us/library/ms229006.aspxから

の例外をトリガ

public int Max 
{ 
    get { return m_Max; } 
    set 
    { 
     if (value>0 && value<100) 
     { 
      m_Max=value; 
     } 
    } 
} 
  • プロパティに割り当てる前に入力を検証する多くの利点

    1. を持っています

      1. プロパティセッターが例外をスローすると前の値を保持します。

      2. プロパティゲッターから例外をスローします。ゲッターは 例外を投げることができるならば、おそらく方法

      public int Max 
          { 
           get { return m_Max; } 
           set { 
            if(value > 0 && value < 100){ \\Value is within valid range 
             m_Max = value; 
            } 
            else if(value < 0) 
             //throw some exception to indicate value is not valid 
            else if(value > 100) 
             //throw some exception to indicate value is not valid 
           } 
          } 
      
  • +1

    自分のコードを書式設定できません – Kira

    +0

    プロパティが例外をスローするのは悪いことです(インデクサーでない限り)。詳細については、[このプロパティと例外についての質問](http://stackoverflow.com/questions/1488472/best-practices-throwing-exceptions-from-properties)を参照してください。要するに、あなたの財産が投げることができるなら、それはおそらく方法であるべきです。あなたの2番目の例では、私は最大ゲッターを保持しますが、SetMaxメソッドでセッターを置き換えます。 – AnorZaken

    +0

    設定者にとって、例外は適切で許容可能なエラー処理戦略であることを示します。 – Kira