首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >不同吸气剂风格的C#差异

不同吸气剂风格的C#差异
EN

Stack Overflow用户
提问于 2017-09-05 13:44:42
回答 3查看 10.3K关注 0票数 155

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

代码语言:javascript
复制
public int Number { get; } = 0

public int Number => 0;

有人能告诉我这两者之间有什么不同吗?他们的行为是怎样的?它们都是只读的吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-09-05 13:46:18

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

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

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

第一版

代码语言:javascript
复制
private readonly int _number = 0;
public int Number { get { return _number; } }

第二版

代码语言:javascript
复制
public int Number { get { return 0; } }

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

代码语言:javascript
复制
public DateTime CreationTime { get; } = DateTime.UtcNow;
public DateTime CurrentTime => DateTime.UtcNow;

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

票数 266
EN

Stack Overflow用户

发布于 2017-09-05 18:36:05

一个不同之处在于何时计算该0:在创建对象时还是在使用属性时。

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

代码语言:javascript
复制
class SomeTestClass
{
    public DateTime Start { get; } = DateTime.Now;

    public DateTime Now => DateTime.Now;
}

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

说明

第一个版本("Start")提供了一个初始值,该初始值甚至可能被构造函数覆盖。所以这只需要计算一次。

第二个版本("Now")提供了将成为该属性的"getter“的表达式。因此,每次读取该属性时都会对其进行评估。甚至没有构造函数可以覆盖的后备字段。

票数 248
EN

Stack Overflow用户

发布于 2017-09-05 13:48:45

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

第一个示例

代码语言:javascript
复制
public int Number { get; } = 0

第一个示例是getter-only auto property。仅限getter的auto-property的支持字段被隐式声明为readonly。

第二个示例

代码语言:javascript
复制
public int Number => 0;

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

两者都是只读的。

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46047721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档