C# 3.0 C#3.0:自动属性-编译器创建的私有变量的名称是什么

C# 3.0 C#3.0:自动属性-编译器创建的私有变量的名称是什么,c#-3.0,automatic-properties,C# 3.0,Automatic Properties,我在检查.NET3.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; } } 如果我使用自动属性,

我在检查.NET3.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的私有变量名是什么?internet上的教程说编译器将自动创建一个私有变量。那么,如果我想在这个类的方法中使用这个私有变量,我如何使用/访问它呢?

如果使用自动属性,那么就不能访问私有字段。它不仅是私有的,而且是匿名的。

重写为更清晰的

该字段是正确生成的,但它对于代码来说不是一个常规字段

以下是您典型的自动属性:

public string FirstName  { get; set; }
如果我们查看编译后的程序集,它将生成以下备份存储字段:

[CompilerGenerated]
private string <FirstName>k__BackingField;
请注意,由于该字段实际上存在于程序集中,这意味着这不是抖动魔法,而是编译器魔法,因此您可以使用反射来查找和访问该字段

但再说一遍,你为什么要这么做

现在,让我们假设您确实有一个合法的理由想要使用字段,而不是属性。我可以想到一个,尽管我可能会做不同的事情,那就是您希望将字段名作为out或ref参数传递给一个方法,如下所示:

public string FirstName  { get; private set; }
public void AdjustName(ref String name)
{
    name = Capitalize(name);
}
private string firstName;
public string FirstName
{
    get { return firstName; }
    set { firstName = value; }
}
您无法将属性作为out/ref参数传递,因此此代码无法工作:

AdjustName(ref string FirstName);
在这种情况下,您需要回到定义属性的“旧”方式,手动添加backing store字段,如下所示:

public string FirstName  { get; private set; }
public void AdjustName(ref String name)
{
    name = Capitalize(name);
}
private string firstName;
public string FirstName
{
    get { return firstName; }
    set { firstName = value; }
}
有了它,您可以调用该方法:

AdjustName(ref string firstName); // note the field, not the property

但是,我可能会更改该方法以返回新值,而不是直接调整引用的变量。

如前所述:您无法访问自动生成的变量(不使用坏技巧)。但我假设你问这个问题是因为你只想有一个getter,但仍然想使用自动属性。。。正确的?在这种情况下,您可以使用此选项:

public string FirstName  { get; private set; }
现在你有一个私人的二传手和一个公共的接球手

那么,如果我想在这个类的方法中使用私有变量,我如何使用/访问它呢

在源代码中,您只需要,并且只允许使用属性访问器
person.LastName
LastName
(如果您在person类中编写代码)


编译器将自动创建一个私有成员变量或支持字段,但这存在于代码中。它不存在于源代码中的任何地方。

我想在进行数学计算的方法中使用该属性的值,那么为什么不直接使用该属性本身呢?get所做的唯一事情就是返回该特定值;)。抱歉,忘了说我对Shyju发表了评论。@Shyju:我认为您可能错误地认为Visual Studio将自动生成一个私有字段供您使用。自动生成由编译器完成,并且只存在于CIL代码中。如果您真的必须获得私有字段,那么您可以使用反射。但我很确定这不是你想要的,对吧。如果出于任何原因,您认为需要访问私有成员(而不是出于好奇),那么不要实现这样的属性,而是定义您自己的私有成员。比如“在过去”;-)请注意,这是C#3.0的一项功能,而不是.NET 3.5-即使您是从C#3.0编译器以.NET 2.0为目标,也可以使用它