不同 getter 样式之间的 C # 差异

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

public int Number { get; } = 0


public int Number => 0;

有人能告诉我这两者之间有什么不同吗。他们表现如何?它们都是只读的吗?

10342 次浏览

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

这些都是 C # 6语言的特性。

第一个例子

public int Number { get; } = 0

第一个例子是 只有 getter 的 auto 属性。 getter-only auto-property 的后备字段被隐式声明为 readonly。

第二个例子

public int Number => 0;

第二个例子是 类属性函数成员上的表达式体。请注意,没有任何 get关键字: 它是通过使用表达式主体语法来暗示的。

两者都是只读的。

一个区别是在对象创建或使用属性时计算 0

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

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


public DateTime Now => DateTime.Now;
}

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

解说 :

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