不同getter风格之间C#的差异

时间:2017-09-05 05:44:42

标签: c# getter shorthand coding-style

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

public int Number { get; } = 0

public int Number => 0;

有人可以告诉我这两者之间是否有任何差异。他们的表现如何?它们都是只读的吗?

3 个答案:

答案 0 :(得分:264)

是的,它们都是只读的,但有区别。在第一个中,有一个支持字段,在执行构造函数之前将其初始化为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被评估,因此您可能会得到可能不同的结果。

答案 1 :(得分:247)

一个区别是评估0时:创建对象时或使用属性时。

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

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

    public DateTime Now => DateTime.Now;
}

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

<强>解释

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

答案 2 :(得分:20)

这些是C#6语言功能。

第一个例子

public int Number { get; } = 0

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

第二个例子

public int Number => 0;

第二个例子是expression bodies on property-like function members。请注意,没有任何get关键字:使用表达式正文语法暗示了这一点。

两者都是只读的。