53

I'm a bit confused on the point of Automatic properties in C# e.g

public string Forename{ get; set; }

I get that you are saving code by not having to declare a private variable, but what's the point of a property when you are not using any get or set logic? Why not just use

public string Forename; 

I'm not sure what the difference between these 2 statements is, I always thought you used properties if you wanted additional get/set logic?

4

11 に答える 11

118

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

于 2009-08-18T15:34:43.563 に答える
15

あなたは書ける

public string Forename{ get; private set; }

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

于 2009-08-18T15:36:23.607 に答える
12

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

最初のケースでは、コンパイラが自動的にフィールドを追加し、プロパティをラップします。これは基本的に次のことと同じです。

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

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

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

于 2009-08-18T15:37:39.000 に答える
6

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

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

于 2009-08-18T15:34:00.740 に答える
4

Automatic Properties と Public Fields の違いFields vs PropertiesAutomatic Properties - Useful or Not?に関するいくつかの関連スレッドを見ることを検討してください。、パブリック フィールドを使用しない理由

于 2009-08-18T15:45:45.553 に答える
2

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

自動プロパティは、カプセル化を提供し、単純なプロパティの定型コードを書くという単調な作業を避けるためにあります。

public string ID { get; set;}

将来、自動プロパティを非自動プロパティに変更できます (たとえば、setter でいくつかの検証を行っている場合など)...既存のクライアントを壊すことはありません。

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;
   }
}

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

于 2009-08-18T15:35:58.350 に答える
1

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

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

于 2009-08-18T15:39:29.187 に答える
1

プロパティはコントラクトのようなもので、クラスとプロパティを使用するクライアントに影響を与えることなく、プロパティの実装を変更できます。現在はロジックがないかもしれませんが、ビジネス要件が変化し、コードを導入したい場合は、プロパティが最も安全な方法です。次の 2 つのリンクは、優れた C# ビデオ チュートリアルです。最初のビデオでは、フィールドを使用するだけでなく、プロパティの必要性について説明し、2 番目のビデオでは、さまざまな種類のプロパティについて説明します。とても便利だと思いました。

C# でのプロパティの必要性

C# のプロパティ、読み取り専用、書き込み専用、読み取り/書き込み、自動実装

于 2012-06-26T11:36:15.747 に答える
1

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

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

于 2009-08-18T16:05:06.123 に答える
1

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

于 2009-08-18T15:33:50.943 に答える
0

次のコードと説明を見てください。
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# の概要

于 2013-12-10T12:21:29.880 に答える