誰かがC#の自動プロパティ、その目的、そしておそらくいくつかの例を簡単に説明できますか?素人の言葉で物事を保つようにしてください、してください!
プロパティアクセサーで追加のロジックが必要ない場合は、自動プロパティが使用されます。
宣言は次のようになります。
public int SomeProperty { get; set; }
これらは単なる構文上のシュガーなので、次のような長いコードを記述する必要はありません。
private int _someField;
public int SomeProperty
{
get { return _someField;}
set { _someField = value;}
}
編集:これらを使用して、クラス内にプライベート変数を簡単に入れることができますが、クラスの外部から見えるようにします(それらを変更することなく)
ああ、自動プロパティのもう1つの利点は、インターフェイスで使用できることです! (どの種類のメンバー変数も許可しない)
通常のプロパティでは、次のようなことができます。
private string example;
public string Example
{
get { return example; }
set { example = value; }
}
自動プロパティを使用すると、本当に簡潔なものを作成できます。
public string Example { get; set; }
したがって、クラス内でのみ設定可能なフィールドを作成する場合は、次のようにします。
public string Example { get; private set; }
これは次と同等です:
private string example;
public string Example
{
get { return example; }
private set { example = value; }
}
またはJavaの場合:
private String example;
public String getExample() {
return example;
}
public void setExample(String value) {
example = value;
}
編集:@Payaはまた私に警告しました:
プロパティまたは自動プロパティを使用する理由を尋ねる場合、これがその背後にある設計哲学です。
重要な設計原則の1つは、neverフィールドをパブリックとして公開するが、常にプロパティを介してすべてにアクセスすることです。これは、フィールドにいつアクセスしたか、さらに重要なことには、いつ設定したかがわからないためです。現在、多くの場合、値の設定または取得中に必要な処理(範囲チェックなど)はありません。これが自動プロパティが作成された理由です。プロパティを作成する簡単な1行の方法です。そのバッキングストアは、コンパイラによって作成されます。
これは社内プログラムに対しても私が行うことですが、一般に使用するために設計されたもの(販売、オープンソースなど)にとってはおそらくより重要です。自動プロパティを使用して、後でset
またはget
で何か他のことを行う必要があると判断した場合、パブリックインターフェイスを壊さずにコードを簡単に変更できます。
更新
以下のコメントの明確化のポイントとして、すべてのコードが独自のものである場合、いいえ、それはプロパティとフィールドの違いをあまりあなたにもたらさないかもしれません。ただし、他のユーザーが使用するライブラリを設計している場合、そのライブラリを使用するコードを最初に再コンパイルしない限り、パブリックフィールドとプロパティを切り替えると例外が発生します。
テストとして、ライブラリプロジェクトを作成し、TestData
というプロパティを宣言しました。このライブラリを使用するためだけに、まったく新しいプロジェクトを作成しました。すべてが期待どおりに機能しました。次に、プロパティをパブリックフィールドに変更し(名前は同じまま)、消費ライブラリを再コンパイルせずに新しいライブラリDLLにコピーしました。メソッドプロパティメソッドを見つけるget_TestData
およびset_TestData
、ただし、フィールドはメソッドを介してアクセスされません。
Unhandled Exception: System.MissingMethodException: Method not found: 'Void TestLibrary.TesterClass.set_TestData(System.String)'.
at TestLibraryConsumer.Program.Main(String[] args)
これらは、プログラマーにいくつかのキーストロークを節約するためのコーディングのショートカットです。これをすべて入力する代わりに:
private string _lastName;
public string LastName {
get {
return _lastName;
}
set {
_lastName = value;
}
}
次のように入力できます:
public string LastName {
get; set;
}
そして、コンパイラーに残りを自動的に生成させます。
From 自動実装プロパティ(C#プログラミングガイド) :
C#3.0以降では、プロパティアクセサーで追加のロジックが不要な場合、自動実装プロパティによりプロパティ宣言がより簡潔になります。また、クライアントコードがオブジェクトを作成できるようにします。
プロパティを宣言すると、コンパイラは、プロパティのgetおよびsetアクセサを介してのみアクセスできるプライベートな匿名バッキングフィールドを作成します。
class Person
{
public string Name { get; set; }
}
以前のバージョンのC#では、プロパティを使用するには、値を保持するフィールド(バッキングストアと呼ばれる)を作成する必要がありました。
private string _something;
public string Prop { get { return _something; } }
C#3.0以降、この要件は不要になり、コンパイラが自動的にバッキングストアを作成するため、_somethingフィールドを宣言する必要はありません。
この問題の詳細については、こちらをご覧ください: http://msdn.Microsoft.com/en-us/library/bb384054.aspx
お役に立てれば。
簡略化受け入れられた答え、あなたはまた使用:
public int SomeProperty { get; private set; }
同じ効果があり、そのために別の変数を作成する必要はありません。
多くの人々はすでに、自動プロパティは構文糖-単純なプロパティを記述する簡単な方法であると述べています。パブリック変数とパブリックプロパティの違いと、2つを切り替えるときに再コンパイルする必要がある理由について説明します。以下を取ります:
public class MyClass
{
public int MyPublicVariable = 0;
public int MyPublicProperty
{
get;
set;
}
}
概念的ににコンパイルすると、実際には次のようになります。
public class MyClass
{
public int MyPublicVariable = 0;
private int MyPublicProperty = 0;
public int get_MyPublicProperty()
{
return MyPublicProperty;
}
public void set_MyPublicProperty( int value )
{
MyPublicProperty = value;
}
}
ずっと前に、プロパティはgetメソッドとsetメソッドのペアを定義するための迅速かつ簡単な方法として発明されました。意図を伝え、一貫性を確保したため、コードが読みやすく、理解しやすくなりました。
MyClass myClass = new MyClass();
myClass.MyPublicVariable = 2;
myClass.MyPublicProperty = 2;
コンパイルすると、再び概念的にになり、次のようになります。
MyClass myClass = new MyClass();
myClass.MyPublicVariable = 2;
myClass.set_MyPublicProperty( 2 );
したがって、パブリック変数よりパブリックプロパティを優先する理由の1つは、コードの進化に応じて異なるロジックを使用する必要がある場合、コードのコンシューマーは必ずしも再コンパイルする必要がないことです。これが、ベストプラクティスと見なされることが多い理由です。また、自動プロパティが発明された理由でもあります。このベストプラクティスを維持しながら、コードの記述をスピードアップするためです。
インターフェイスに関するコメントもいくつかあります。インターフェイスは基本的に、それらを実装するクラス内の特定のメソッドの存在を保証するコントラクトです。上記からわかるように、プロパティは1つまたは2つのメソッドを表しているため、インターフェイスでうまく機能します。
これが少し役立つことを願っています。
興味深い可能性のある別の例を次に示します。
public class MyClass
{
private int[] _myArray = new int[ 5 ];
public int MyArray[ int index ]
{
get
{
return _myArray[ index ];
}
set
{
_myArray[ index ] = value;
}
}
}
public class MyClass
{
private int[] _myArray = new int[ 5 ];
public int get_MyArray( int index )
{
return _myArray[ index ];
}
public void set_MyArray( int index, int value )
{
_myArray[ index ] = value;
}
}
注:プロパティを逆コンパイルするときに使用されるメソッドシグネチャを正確に思い出せません。 「get_XXX」と「set_XXX」だと思いますが、非常によく似た他の何かかもしれません。理解がそこにある限り、それはおそらくあまり重要ではありません。最終的に、それらはすべてメモリアドレスになります:-)