拿这段代码:
public int Foo {get;set;}
与此更完整的手动编写代码相反:
private int x;
public int X
{
get { return x; }
set { x = value; }
}
在第一个示例中,编译器是否自动创建私有foo
属性?
我不确定我所看到的这个约定是否有一个小写的私有属性被面向公众的大写掩盖,只是那个,约定,或者它实际上是语言/编译器的一部分,你可以写它出来或让它为你完成。
答案 0 :(得分:5)
为什么不看看发生了什么?
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
属性
答案 1 :(得分:3)
外壳与它无关。
写下面的属性
public int x { get; set; }
将始终创建并使用通过get
/ set
进行操作的匿名私有字段。
答案 2 :(得分:1)
编译器会为您创建所需类型的私有后备字段,但是使用其他名称(不仅仅是x
,例如<X>_BackingField
)。因此,您无法访问该字段。但实际语法非常相似。
进一步了解auto-generated properties:
编译器创建一个私有的匿名支持字段,只能通过属性的get和set访问器访问。
说完这个问题后,你问题中的两个代码样本的含义是相同的。