より明確に書き直しました
フィールドは問題なく生成されますが、通常のフィールドとしてコードに表示されません。
典型的な自動プロパティは次のとおりです。
public string FirstName { get; set; }
コンパイルされたアセンブリを見ると、次のバッキング ストア フィールドが生成されます。
[CompilerGenerated]
private string <FirstName>k__BackingField;
そこにある < と > に注意してください。これらは、独自のフィールド名に使用できる文字ではありません。また、そのフィールドにアクセスすることもできません。これは、コンパイラがコードを調べたときに、コンパイラが気にする限り「存在」しないためです。
ここでの本当の質問は、なぜそのフィールドにアクセスしたいのかということです。言い換えれば、なぜフィールドへのアクセスが必要なのですか? また、プロパティへのアクセスではできないことがコードに何をもたらすのでしょうか?
フィールドへの外部書き込みアクセスを防止したい場合は、次のようにセッター メソッドをプライベートにすることで簡単に実行できます。
public string FirstName { get; private set; }
フィールドは実際にはアセンブリに存在するため、これは JITter マジックではなくコンパイラ マジックであることを意味することに注意してください。したがって、リフレクションを使用してそのフィールドを見つけてアクセスできます。
しかし、繰り返しますが、なぜそうしたいのですか?
ここで、プロパティではなくフィールドを使用する正当な理由があると仮定しましょう。1 つ考えられますが、おそらく別の方法で行うと思いますが、それは、次のように、フィールド名を out または ref パラメーターとしてメソッドに渡したい場合です。
public void AdjustName(ref String name)
{
name = Capitalize(name);
}
プロパティを out/ref-parameters として渡すことはできないため、次のコードは機能しません。
AdjustName(ref string FirstName);
この場合、次のようにバッキング ストア フィールドを手動で追加して、プロパティを定義する「古い」方法にフォールバックする必要があります。
private string firstName;
public string FirstName
{
get { return firstName; }
set { firstName = value; }
}
これで、そのメソッドを呼び出すことができます:
AdjustName(ref string firstName); // note the field, not the property
ただし、参照される変数を直接調整するのではなく、新しい値を返すためにそのメソッドを変更する可能性があります。