仅具有 getter 的自动化属性可以设置,为什么?

2024-02-02

我创建了一个自动化属性:

public int Foo { get; } 

这只是吸气剂。 但是当我构建构造函数时,我可以更改该值:

public MyClass(string name)
{
    Foo = 5;
}

为什么这是可能的,即使这是仅获取的?


这是一个新的 C# 6 功能,“Getter-only 自动属性”,也称为“只读属性的自动属性初始化器”,如此处讨论的MSDN 杂志文章“C#:新的和改进的 C# 6.0”,作者:Mark Michaelis https://msdn.microsoft.com/en-gb/magazine/dn802602.aspx并在C# 6.0 语言规范草案 https://github.com/dotnet/csharplang/blob/master/spec/classes.md#automatically-implemented-properties.

只读字段的 setter 只能在构造函数中访问,在所有其他情况下,该字段仍然是只读的并且行为与以前一样。

这是一种方便的语法,可以减少需要键入的代码量,并且无需显式声明私有模块级变量来保存值。

这个功能被认为很重要,因为自从 C#3 中引入自动实现属性以来,可变属性(具有 getter 和 setter 的属性)比不可变属性(仅具有 getter 的属性)编写起来更快,这意味着人们试图使用可变属性来避免为只读属性通常所需的支持字段键入代码。在中对自动实现的属性有更多讨论Microsoft C# 编程指南的相关部分 https://msdn.microsoft.com/en-us/library/bb384054.aspx.

这篇博文“#1,207 – C# 6.0 – 只读属性的自动属性初始化器”,作者:Sean Sexton http://csharp.2000things.com/2014/10/20/1207-c-6-0-auto-property-initializers-for-read-only-properties/有很好的解释和例子如下:

在 C# 6.0 之前,如果您想要只读(不可变)属性,您可以 通常使用在中初始化的只读支持字段 构造函数,如下所示。

public class Dog 
{
    public string Name { get; set; }

    // DogCreationTime is immutable
    private readonly DateTime creTime;
    public DateTime DogCreationTime 
    {
        get { return creTime; }
    }

    public Dog(string name)
    {
        Name = name;
        creTime = DateTime.Now;
    }
}

在 C# 6.0 中,您可以使用自动实现的属性来实现 只读属性。您可以通过使用自动属性来做到这一点 初始化程序。结果比上面的例子干净得多,其中 我们必须明确声明一个支持字段。

public class Dog
{
    public string Name { get; set; }

    // DogCreationTime is immutable
    public DateTime DogCreationTime { get; } = DateTime.Now;

    public Dog(string name)
    {
        Name = name;
    }
}

更多详细信息还可以在GitHub 上的 dotnet Roslyn 存储库 https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23-6:

现在可以在没有设置器的情况下声明自动属性。

仅 getter 自动属性的支持字段是隐式的 声明为只读(尽管这只对反射重要 目的)。它可以通过初始化程序来初始化 属性如上例所示。此外,仅吸气剂属性可以是 分配给声明类型的构造函数主体,这会导致 直接分配给基础字段的值:

这是为了更简洁地表达类型,但请注意,它也 消除了可变和可变语言之间的重要差异 不可变类型:自动属性是仅在以下情况下才可用的简写 你愿意让你的类变得可变,所以诱惑 默认就很好了。现在,有了仅 getter 自动属性, 竞争环境在可变和不可变之间是公平的。

并在C# 6.0 语言规范草案 https://github.com/dotnet/csharplang/blob/master/spec/classes.md#automatically-implemented-properties(注意:就 Microsoft 而言,语言规范是最终的,但它是尚未被批准为 EMCA/ISO 标准 https://en.wikipedia.org/wiki/C_Sharp_(programming_language)#Versions,因此是“草案”):

自动实现的属性

自动实现的属性(或简称自动属性)是 具有仅分号访问器的非抽象非外部属性 身体。自动属性必须有一个 get 访问器并且可以选择 有一个 set 访问器。

当属性被指定为自动实现的属性时, 隐藏的支持字段自动可用于该属性, 并且访问器被实现来读取和写入 支持场。如果自动属性没有设置访问器,则支持 字段被视为只读(Readonly fields)。就像只读一样 字段,也可以在主体中分配仅 getter 自动属性 封闭类的构造函数。这样的分配分配 直接到属性的只读支持字段。

自动属性可以选择有一个 property_initializer,它是 作为variable_initializer直接应用于支持字段 (变量初始值设定项)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅具有 getter 的自动化属性可以设置,为什么? 的相关文章

随机推荐