10

.NET 3.5 の新機能をチェックしていたところ、C# 3.0 で使用できることがわかりました。

public class Person 
{    
 public string FirstName  { get; set; }
 public string LastName  { get; set; }
}

それ以外の

private string name;

public string Name
{
  get { return name; }
  set { name = value; }
}

自動プロパティを使用すると、 Name のプライベート変数名は何になりますか? インターネット上のチュートリアルでは、コンパイラが自動的にプライベート変数を作成すると述べています。このクラスのメソッドで使用したい場合、プライベート変数を使用/アクセスするにはどうすればよいですか?

4

4 に答える 4

21

より明確に書き直しました

フィールドは問題なく生成されますが、通常のフィールドとしてコードに表示されません。

典型的な自動プロパティは次のとおりです。

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

ただし、参照される変数を直接調整するのではなく、新しい値を返すためにそのメソッドを変更する可能性があります。

于 2009-08-14T10:00:17.937 に答える
5

すでに述べたように、自動生成された変数にアクセスすることはできません (悪いトリックを使用しないと)。しかし、ゲッターだけを持ちたいが、自動プロパティを使用したいので、その質問をしていると思います...そうですか?その場合、これを使用できます:

public string FirstName  { get; private set; }

これで、プライベート セッターとパブリック ゲッターができました。

于 2009-08-14T10:09:24.660 に答える
1

自動プロパティを使用する場合、プライベート フィールドにはアクセスできません。プライベートなだけでなく、匿名でもあります。

于 2009-08-14T09:59:00.560 に答える
0

では、このクラスのメソッドでプライベート変数を使用したい場合、プライベート変数にアクセスするにはどうすればよいですか?

person.LastNameソース コードでは、Property Accessor を使用するかLastName、person クラス内でコードを記述している場合にのみ、使用する必要があり、それを使用することが許可されています。

コンパイラはプライベート メンバー変数またはバッキング フィールドを自動的に作成しますが、これはCILコードに存在します。ソース コードのどこにも存在しません。

于 2009-08-14T10:12:18.180 に答える