首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >省略策划人还是私人策划人?

省略策划人还是私人策划人?
EN

Stack Overflow用户
提问于 2016-04-22 11:16:54
回答 5查看 10.4K关注 0票数 58

省略的属性和私有的属性之间有什么区别?

代码语言:javascript
复制
public string Foo { get; private set; }

vs

代码语言:javascript
复制
public string Foo { get; }
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-04-22 11:18:39

在C# 6中,仅get;属性只能从构造函数中设置。从其他地方来看,它是只读的。

可以从该类中的任何地方设置带有private set;的属性。

票数 75
EN

Stack Overflow用户

发布于 2016-04-22 11:18:28

在类之外,如果使用以下语法,则不会更改任何内容:

代码语言:javascript
复制
public string Foo { get; }

但是,除了在构造函数中,您将无法更新类中的Foo,要这样做,您需要私有的setter:

代码语言:javascript
复制
public string Foo { get; private set; }
票数 12
EN

Stack Overflow用户

发布于 2016-04-22 11:21:59

不同之处在于,在第二种情况下,生成的代码将生成一个只读字段,而且该属性显然不会有一个setter。

让我们来做一个真实的例子:

代码语言:javascript
复制
public class Test
{
    public Test(string name) { Name = name; }
    public string Name { get; private set; }
}

编译器将像这样编译如下:

代码语言:javascript
复制
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,看看会发生什么:

代码语言:javascript
复制
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也离开了该属性。

因此,这实际上是现在创建具有真正只读属性的简单类型的最佳方法,不仅属性本身不可写,而且后备字段也是只读的,这意味着您现在可以更好地编写不可更改的类型。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36792392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档