web-dev-qa-db-ja.com

C#自動プロパティ

私はC#の自動プロパティの点で少し混乱しています

public string Forename{ get; set; }

プライベート変数を宣言する必要がないことでコードを保存していると思いますが、getまたはsetロジックを使用していない場合のプロパティの意味は何ですか?なぜ使用しないのか

public string Forename; 

これらの2つのステートメントの違いが何かはわかりませんが、追加のget/setロジックが必要な場合は、常にプロパティを使用すると思っていましたか?

52
Gavin

プロパティはコントラクトを壊すことなくコードを入れることができ、フィールドはそれらをプロパティに変更せずに(そしてインターフェースを壊さずに)コードを入れることができません。プロパティは読み取り専用または書き込み専用ですが、フィールドはできません。プロパティはデータバインドできますが、フィールドはバインドできません。

117
MatthewMartin

あなたは書ける

public string Forename{ get; private set; }

読み取り専用のプロパティを取得するには...実際のプロパティほど用途が広いわけではありませんが、一部の作品では妥協点です。

15
Sklivvz

これらの2つのステートメントの違いが何かはわかりませんが、追加のget/setロジックが必要な場合は、常にプロパティを使用すると思っていましたか?

前者の場合、コンパイラは自動的にフィールドを追加し、プロパティをラップします。基本的には次のことと同じです。

private string forename;
public string Forename
{
    get
    { 
        return this.forename;
    }
    set
    {
        this.forename = value;
    }
}

フィールドよりもプロパティを使用することには多くの利点があります。データバインディングなどの特定の理由が必要ない場合でも、これはAPIの将来性を保証するのに役立ちます。

主な問題は、フィールドを作成するが、アプリケーションのv2でプロパティが必要な場合、APIが壊れることです。事前に自動プロパティを使用することで、ソースやバイナリの互換性の問題を心配することなく、いつでもAPIを変更できる可能性があります。

13
Reed Copsey

これは、後でロジックを追加することを期待することを意味します。

そのようにして、最初からプロパティとして持っている場合は、依存コードを再構築する必要はありません。変数からプロパティに変更する場合は、変更する必要があります。

6
user151323
4
Nathan Taylor

パブリックデータメンバーは悪です(オブジェクトは自身の状態の変更を制御しないため、グローバル変数になります)。カプセル化を破る-OOPの信条。

自動プロパティは、カプセル化を提供し、単純なプロパティのボイラープレートコードを記述する煩わしさを回避するためにあります。

public string ID { get; set;}

将来、自動プロパティを非自動プロパティに変更できます(たとえば、セッターで検証を行うなど)...既存のクライアントを壊さないようにします。

string m_ID;
public string ID
{
   get { return m_ID; }
   set 
   { 
     //validate value conforms to a certain pattern via a regex match
     m_ID = value;
   }
}

同じことを公開データ属性で行うことはできません。データ属性をプロパティに変更すると、既存のクライアントは再び対話する前に強制的に再コンパイルされます。

2
Gishu

すべてのプロパティにget/setロジックが必要なわけではありません。その場合は、プライベート変数を使用します。たとえば、MV何かのパターンでは、モデルにあまりロジックがありません。ただし、必要に応じて組み合わせることもできます。

プロパティの代わりに提案したようなフィールドを使用する場合、たとえば、インターフェイスにデータフィールドを含めることができないため、クラスを正しく記述するためにインターフェイスを定義することはできません。

1
user29117

1つは、プロパティをvirtualに設定し、継承クラスにロジックを実装することです。後で同じクラスにロジックを実装することもでき、クラスに依存するコードに副作用はありません。

1
user93202

プロパティはコントラクトのようなものであり、クラスとプロパティを使用するクライアントに影響を与えることなく、プロパティの実装を変更できます。今日はロジックがないかもしれませんが、ビジネス要件が変化し、コードを導入したい場合は、プロパティが最も安全です。次の2つのリンクは、優れたC#ビデオチュートリアルです。最初の1つはフィールドの使用に関するプロパティの必要性を説明し、2番目のビデオはさまざまなタイプのプロパティを説明します。私はそれらがとても役に立ったと思いました。

C#のプロパティが必要

C#のPoperties、読み取り専用、書き込み専用、読み取り/書き込み、自動実装

1
Ravi Ravilla

自動プロパティを追加すると、コンパイラはアプリケーションにget setロジックを追加します。つまり、後でこのロジックに追加しても、外部ライブラリからのプロパティへの参照は引き続き機能します。

パブリック変数からプロパティに移行した場合、これはあなたのライブラリを参照する他のライブラリの重大な変更になります-したがって、なぜ自動プロパティから始めないのですか? :)

1
MattH

次のコードと説明を見てください。
The most common implementation for a property is getter or a setter that simply reads and writes to a private field of the same type as a property. An automatic property declaration instructs the compiler to provide this implementation. The compiler automatically generates a private backing field.
次のコードを調べてください:-

    public class Stock 
    {
      decimal currentPrice ;  // private backing field.
      public decimal CurrentPrice 
      {
        get { return currentPrice ; }
        set { currentPrice = value ; }
      }
   }

同じコードは次のように書き直すことができます:-

   public class Stock
   {
     public decimal CurrentPrice { get ; set ; } // The compiler will auto generate a backing field.
   }

出典:-C#の概要

0
Pratik Singhal