=> constant到{get;之间的差异 } =常数

jay*_*jay -1 c# c#-6.0

在最佳实践和性能(如果有的话)的上下文中,什么更好地暴露在C#6+样式属性中作为属性设置或计算的值?

我正在比较表达身体的属性

public string Name => "bob";
Run Code Online (Sandbox Code Playgroud)

自动属性初始化

public string Name { get; } = "bob";
Run Code Online (Sandbox Code Playgroud)

对同样的事情有害吗?我在文档中的任何地方都找不到哪个用于我的案例.如果在SO中已经涵盖了这一点,我很抱歉,搜索让我无处可去.

Zoh*_*led 7

谨防!表达式bodied属性将在每次调用时执行表达式!您可以在我的答案的最后部分看到示例.

public string Name => "bob";
Run Code Online (Sandbox Code Playgroud)

是语法糖

public string Name
{
    get
    {
        return "bob";
    }
}
Run Code Online (Sandbox Code Playgroud)

public string Name { get; } = "bob";
Run Code Online (Sandbox Code Playgroud)

是语法糖

private readonly string _name = "bob";

public string Name
{
    get
    {
        return _name ;
    }
}
Run Code Online (Sandbox Code Playgroud)

自己检查一下.

当心 - 这是危险的部分!

请注意,每次调用此属性时都将执行表达式主体.当它返回一个硬编码值时很好,但是如果它返回一个列表,例如,它每次都会返回一个新列表:

public List<String> Names => new List<String>() {"bob"};
Run Code Online (Sandbox Code Playgroud)

语法糖是:

public List<string> Names
{
    get
    {
        return new List<string>() {"bob"};
    }
}
Run Code Online (Sandbox Code Playgroud)

自动属性初始化不是这种情况:

public List<String> Names { get; } = new List<String>() {"bob"};
Run Code Online (Sandbox Code Playgroud)

这是语法糖:

private readonly List<string> _names = new List<string>() {"bob"};

public string Names 
{
    get
    {
         return _names;
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,此处列表仅初始化一次.

自己检查一下.