=> 常量与 { get; 之间的区别} =常数

Difference between => constant to { get; } = constant

在最佳实践和性能(如果有的话)的上下文中,在 C# 6+ 样式属性中将设置或计算一次的值公开为 属性 有什么更好的方法?

我比较expression bodied properties

public string Name => "bob";

auto-property initialisation

public string Name { get; } = "bob";

它对同一个东西脱糖吗?我在文档中找不到任何地方说明我的案例要使用哪个。如果 SO 中已经涵盖了这一点,我深表歉意,搜索让我找不到任何地方。

第一个是箭头函数,结果是一个 returns 常量值的函数:

// syntactic sugar for:
public string Name { get { return "bob"; } }

// results into:
public string get_Name() 
{
    return "bob";
}

第二个是自动 属性,它导致 getter 后备字段值为 "bob":

// results into:
private string _name = "bob";
public string get_Name()
{
    return _name;
}

小心! expression bodied 属性将在每次调用时执行表达式 你可以在我的答案的最后部分看到示例。

public string Name => "bob";

的语法糖
public string Name
{
    get
    {
        return "bob";
    }
}

同时

public string Name { get; } = "bob";

的语法糖
private readonly string _name = "bob";

public string Name
{
    get
    {
        return _name ;
    }
}

Check it out yourself.

注意 - 这是危险的部分!

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

public List<String> Names => new List<String>() {"bob"};

是语法糖:

public List<string> Names
{
    get
    {
        return new List<string>() {"bob"};
    }
}

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

public List<String> Names { get; } = new List<String>() {"bob"};

是语法糖:

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

public string Names 
{
    get
    {
         return _names;
    }
}

如您所见,这里的列表只初始化了一次。

Check it out yourself.