【问题标题】:Difference in C# between different getter styles不同 getter 样式之间的 C# 差异
【发布时间】:2018-02-13 07:43:05
【问题描述】:

我有时确实会在 getter 的属性中看到缩写。例如。这两种类型:

public int Number { get; } = 0

public int Number => 0;

谁能告诉我这两者之间是否有任何区别。他们的行为如何?它们都是只读的吗?

【问题讨论】:

    标签: c# getter shorthand coding-style


    【解决方案1】:

    是的,它们都是只读的,但是有区别。在第一个中,有一个支持字段,在执行构造函数之前初始化为 0。您可以仅在构造函数中更改值,就像普通的只读字段一样。 getter 本身只是返回字段的值。

    在第二个中,getter 每次只返回 0,不涉及任何字段。

    因此,为了避免使用任何自动实现的属性或表达式体成员,我们有:

    第一版

    private readonly int _number = 0;
    public int Number { get { return _number; } }
    

    第二版

    public int Number { get { return 0; } }
    

    一个更清晰的差异示例可能如下所示:

    public DateTime CreationTime { get; } = DateTime.UtcNow;
    public DateTime CurrentTime => DateTime.UtcNow;
    

    如果您创建单个对象,其CreationTime 属性将始终给出相同的结果 - 因为它存储在只读字段中,在对象构造时初始化。但是,每次您访问 CurrentTime 属性时,都会导致对 DateTime.UtcNow 进行评估,因此您可能会得到不同的结果。

    【讨论】:

    • 请注意,第二个版本并不总是返回相同的值。一个很好的例子是如果你返回random.NextInt()。第一个版本将评估一次并且始终具有相同的值。第二个每次都会返回一个新值。
    【解决方案2】:

    一个不同之处在于评估 0 的时间:创建对象时或使用属性时。

    您可以使用 DateTime 属性更好地看到这一点:

    class SomeTestClass
    {
        public DateTime Start { get; } = DateTime.Now;
    
        public DateTime Now => DateTime.Now;
    }
    

    Start 属性始终返回相同的时间(实例创建时间),而Now 更改以反映当前时间。

    说明

    第一个版本(“Start”)提供了一个初始值,甚至可以被构造函数覆盖。所以这只会被评估一次。
    第二个版本(“Now”)提供了将成为该属性的“getter”的表达式。因此,每次读取属性时都会对其进行评估。甚至没有构造函数可以覆盖的支持字段。

    【讨论】:

    • 这是我认为最重要的区别。
    • 接受的答案最准确地定义了示例代码中的差异,但这解释了两种结构中更有用的差异。
    • 哇,你得到的赞成票比著名的 Jon Skeet 还多。
    【解决方案3】:

    这些是 C# 6 语言功能。

    第一个例子

    public int Number { get; } = 0
    

    第一个例子是getter-only auto property。 getter-only 自动属性的支持字段被隐式声明为只读。

    第二个例子

    public int Number => 0;
    

    第二个例子是expression bodies on property-like function members。请注意,没有任何get 关键字:它是通过使用表达式主体语法来暗示的。

    两者都是只读的。

    【讨论】:

    • ...但正如 Jon Skeet 解释的那样,您可以更改第一个返回的值。
    • @MartinBonner ...但仅在构造函数中。
    • 或者像往常一样,通过反射(轻微吹毛求疵)
    猜你喜欢
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 2018-05-15
    • 2012-11-14
    相关资源
    最近更新 更多