重写得更清楚
该字段已正常生成,但它作为常规字段对您的代码不可见。
这是典型的自动属性:
public string FirstName { get; set; }
如果我们查看编译后的程序集,会生成以下后备存储字段:
[CompilerGenerated]
private string <FirstName>k__BackingField;
请注意其中的 ,它们不是您可以在自己的字段名称中使用的字符。您也无法访问该字段,因为当编译器查看您的代码时,它并不“存在”。
对我来说,真正的问题是why您想要访问该字段。换句话说,为什么您需要访问该字段,以及它对您的代码有什么作用,而访问该属性则不会?
如果您想阻止外部对该字段进行写访问,可以通过将 setter 方法设置为私有来轻松实现,如下所示:
public string FirstName { get; private set; }
请注意,由于该字段实际上存在于程序集中,这意味着这不是 JITter 魔法,而是编译器魔法,因此您可以使用反射来查找和访问该字段。
但话又说回来,你为什么要这么做?
现在,我们假设您确实有合理的理由想要使用该字段而不是属性。我可以想到一个,尽管我可能会采取不同的做法,那就是您希望将字段名称作为 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
但是,我可能会更改该方法以返回新值,而不是直接调整引用的变量。