大写属性是否在 C# 中自动创建小写私有属性?
本文关键字:属性 创建 是否 | 更新日期: 2023-09-27 17:56:51
取以下代码:
public int Foo {get;set;}
与此更完整的手动编写代码相反:
private int x;
public int X
{
get { return x; }
set { x = value; }
}
在第一个示例中,编译器是否会自动创建 private
foo
属性?
不确定我见过的这个约定,即一个小写private
属性被面向public
的大写属性掩盖,是否只是约定,或者它实际上是语言/编译器的一部分,你可以把它写出来,或者让它为你完成。
为什么不看看发生了什么?
public class Test {
// private int myProp;
public int MyProp {
get;
set;
}
}
。
string report = String.Join(Environment.NewLine, typeof(Test)
.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
.Select(field => field.Name));
Console.Write(report);
你会得到一个很奇怪的名字
<MyProp>k__BackingField
但是,这个奇怪的支持字段名称可确保不会有名称冲突(您不能声明任何以 <
开头的字段、属性、方法等)。
编辑:如果您取消注释// private int myProp;
行,您将拥有
myProp <MyProp>k__BackingField
请注意,myProp
不是MyProp
属性的支持字段。
外壳与它无关。
编写如下所示的属性
public int x { get; set; }
将始终创建和使用它通过 get
/set
进行操作的匿名私有字段。
编译器
确实为您创建了一个所需类型的私有支持字段,但是使用另一个名称(它不像您的示例中那样简单地x
,它更像<X>_BackingField
)。因此,您无法访问该字段。但是,实际语法非常相似。
进一步查看自动生成的属性:
编译器创建一个私有的匿名支持字段,只能通过属性的 get 和 set 访问器访问该字段。
话虽如此,您问题中的两个代码示例在含义上是相同的。