省略的属性和私有的属性之间有什么区别?
public string Foo { get; private set; }vs
public string Foo { get; }发布于 2016-04-22 11:18:39
在C# 6中,仅get;属性只能从构造函数中设置。从其他地方来看,它是只读的。
可以从该类中的任何地方设置带有private set;的属性。
发布于 2016-04-22 11:18:28
在类之外,如果使用以下语法,则不会更改任何内容:
public string Foo { get; }但是,除了在构造函数中,您将无法更新类中的Foo,要这样做,您需要私有的setter:
public string Foo { get; private set; }发布于 2016-04-22 11:21:59
不同之处在于,在第二种情况下,生成的代码将生成一个只读字段,而且该属性显然不会有一个setter。
让我们来做一个真实的例子:
public class Test
{
public Test(string name) { Name = name; }
public string Name { get; private set; }
}编译器将像这样编译如下:
public class Test
{
private string <Name>k__BackingField;
public Test(string name)
{
<Name>k__BackingField = name;
}
public string Name
{
get { return <Name>k__BackingField; }
private set { <Name>k__BackingField = value; }
}
}如您所见,编译器已经自动重写了代码,使其具有属性的后备字段。字段名将是那个神秘的名称,它是合法的.NET,而不是C#,这意味着您永远不能编写与自动生成的成员冲突的C#代码。
基本上,C#中的自动属性只是一个带有支持字段的属性的语法糖,实际正在编译的属性仍然有一个支持字段,您只需要显式地编写它。
如您所见,它还自动重写构造函数以直接写入字段。注意,这将在写属性的类中的任何地方执行,因为无论如何,任何自定义代码都不可能介于其中。
现在,让我们从属性中移除setter,看看会发生什么:
public class Test
{
private readonly string <Name>k__BackingField;
public Test(string name)
{
<Name>k__BackingField = name;
}
public string Name
{
get { return <Name>k__BackingField; }
}
}请注意,该字段现在是只读的,而且很明显,setter也离开了该属性。
因此,这实际上是现在创建具有真正只读属性的简单类型的最佳方法,不仅属性本身不可写,而且后备字段也是只读的,这意味着您现在可以更好地编写不可更改的类型。
https://stackoverflow.com/questions/36792392
复制相似问题