大写属性在C#中自动创建小写私有属性吗?
把这个代码:大写属性在C#中自动创建小写私有属性吗?
public int Foo {get;set;}
与此相对更完整的手工编写代码:
private int x;
public int X
{
get { return x; }
set { x = value; }
}
在第一个例子,该编译器自动创建一个私有财产foo
?
我不确定这个惯例是否见过面向公众的大写掩码的小写私有属性就是那个惯例,或者它实际上是语言/编译器的一部分,而且您可以写它出来或让它为你做。
为什么不只是看看发生了什么?
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
财产
因此,我的第二个例子,属性'x'和'X'只是相关的,因为实现指定它是这样的,而不是因为C#的任何固有属性?如果'X'只是'{get;组; }那么他们会是两个不相关的属性? – Aerovistae
@Aerovistae:你说得很对:你将* field *'x'与* property *'X无关;和属性'X'将有自己的*后台字段*和那个奇怪的自动生成的名字。 –
套管与它无关。
写像下面
public int x { get; set; }
总是会创建并使用它通过get
/set
操纵匿名私人领域的财产。
“像下面一样”。 。 。你的意思是你什么时候不填写getter和setter函数,只写'get;'和'set;'?如果你填写一个而不是另一个呢? – Aerovistae
@Aerovistae试试吧。编译器不允许这样写 – HimBromBeere
public int x {get; }'会有区别,它创建一个'readonly'字段,而不是一个普通字段。 –
编译器确实会为您创建一个所需类型的私有后台字段,但是使用另一个名称(不像您的示例中那样只是x
,它更像<X>_BackingField
)。因此你不能访问该领域。但是,实际的语法非常相似。
有在auto-generated properties进一步看:
编译器创建,只能通过属性的get和set访问访问的私有,匿名的支持字段。
说了这话后,你的问题中的两个代码样本的含义是相同的。
深化他的背场,' {get; set;}'和'public int X => 10'只是语法糖 –
public properties should always star t用大写字母和私人字段应始终以下划线开头 – DestinatioN