【发布时间】:2018-02-13 07:43:05
【问题描述】:
我有时确实会在 getter 的属性中看到缩写。例如。这两种类型:
public int Number { get; } = 0
public int Number => 0;
谁能告诉我这两者之间是否有任何区别。他们的行为如何?它们都是只读的吗?
【问题讨论】:
标签: c# getter shorthand coding-style
我有时确实会在 getter 的属性中看到缩写。例如。这两种类型:
public int Number { get; } = 0
public int Number => 0;
谁能告诉我这两者之间是否有任何区别。他们的行为如何?它们都是只读的吗?
【问题讨论】:
标签: c# getter shorthand coding-style
是的,它们都是只读的,但是有区别。在第一个中,有一个支持字段,在执行构造函数之前初始化为 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()。第一个版本将评估一次并且始终具有相同的值。第二个每次都会返回一个新值。
一个不同之处在于评估 0 的时间:创建对象时或使用属性时。
您可以使用 DateTime 属性更好地看到这一点:
class SomeTestClass
{
public DateTime Start { get; } = DateTime.Now;
public DateTime Now => DateTime.Now;
}
Start 属性始终返回相同的时间(实例创建时间),而Now 更改以反映当前时间。
说明:
第一个版本(“Start”)提供了一个初始值,甚至可以被构造函数覆盖。所以这只会被评估一次。
第二个版本(“Now”)提供了将成为该属性的“getter”的表达式。因此,每次读取属性时都会对其进行评估。甚至没有构造函数可以覆盖的支持字段。
【讨论】:
这些是 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 关键字:它是通过使用表达式主体语法来暗示的。
两者都是只读的。
【讨论】: