重複の可能性:
C#のプロパティとフィールドの違い
非常に基本的な質問ですが、検索しても有効な答えが読めません。
例えば
public string abc;
public string abc { get; set; }
これを説明してください。
重複の可能性:
C#のプロパティとフィールドの違い
非常に基本的な質問ですが、検索しても有効な答えが読めません。
例えば
public string abc;
public string abc { get; set; }
これを説明してください。
プロパティには、値の設定/取得に関するコードを含めることができます。パブリック変数には、アクセスするときにコードを含めることはできません。これは大きな違いです。
プロパティを使用すると、コードを使用する人に、現在または将来、値の背後に何らかのコードがある可能性があると言っています。
パブリック変数を使用すると、何らかの値が含まれる退屈な古いフィールドに過ぎないと言っています。
(私の用語について:「フィールド」=パブリック変数、「プロパティ」=取得/設定)
使用法の違いに加えて言及すべきことの1つは、フィールドとは異なり、プロパティはメソッドにコンパイルされます(get_abc
内部的には何かと呼ばれていると思います)。最初から auto プロパティを宣言することには、次の 2 つの利点があります。
1) 反射に問題はありません。一部のリフレクション コードが値がフィールドであることに基づいており、後で「まあ、null テストを追加したい」と考えてプロパティに変更した場合、リフレクション コードは最終的に失敗します (リフレクションですが、それは何の役にも立たない余分な労力になります)
2) 起こりうる副作用の「警告」。フィールドはその値のみを変更でき、メソッドはクラスに対して任意のことを実行できます。そのため、最初からプロパティを宣言すると、バックグラウンドで他の変更が発生する可能性が示されます。(もちろん、setter で奇妙なことを行うべきではありませんが、リストの長さの測定など、提供された 1 つの値から追加の初期化を取得することが非現実的でない場合もあります)
また、可能な限りプロパティを使用するのも良いスタイルだと思います。特に提供された 2 つの理由のためだけでなく、一貫性のためでもあります。
プロパティはバインドをサポートしますが、変数はサポートしないなど、パブリック変数に対するプロパティと同じ違いがあります。
Field の代わりに auto プロパティを使用する理由の 1 つは、互換性です。
たとえば、フィールドを割り当てると、CLR はまさにそれを行います。フィールドを設定します。
プロパティ (auto かどうか) があり、次のように入力した場合
someObject.Whatever = "Value";
フィールドを割り当てているように見えますが、実際には C# コンパイラが次のようなものを挿入します。
someObject.set_Whatever("Value");
それは、フィールドを設定することと同じではありません。また、フィールドがあり、後でそれをプロパティに変更する場合 (たとえば、変更通知などを実装する場合)、元のフィールドを使用するすべてのアセンブリを再コンパイルする必要があります。これは、フィールドの割り当てには設定とは異なるコードが必要になるためです。プロパティ (自動かどうかは関係ありません)。
public フィールドを使用する理由はほとんどありません。自動プロパティは実行時にインライン化できるため、パフォーマンスの違いはありません。また、依存アセンブリを再コンパイルすることなく、get / set メソッドに追加のロジックを追加する可能性が残されています。
変数は直接値を格納しますが、プロパティはクラスとその変数へのウィンドウです。
それらは(ほとんど)同じように機能しますが、フィールドの非常に優れた点の1つは、フィールドで追加の作業(検証や計算の実行など)を行いたい場合に実行できることです。
これはあなたを説明します
public string _abc;
public string abc
{
get
{
return _abc;
};
set
{
if (value == null)
_abc = "";
else
_abc = value;
};
}
ここでnull
がプロパティに渡された場合abc
、それがチェックされ、空の値が に割り当てられ_abc
ます。それ以外の場合は値。
変数でこれが必要な場合。私たちがこれをしなければならなかったすべての場所。
if(foo == null) // here foo is some string
_abc = ""
else
_abc = foo;
プロパティを使用すると、abc = foo; のように実行できます。
これで、プロパティの set セクションがチェックされます。