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

时间:2017-09-27 04:45:58

标签: c# c#-6.0

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

我正在比较expression bodied properties

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

auto-property initialisation

{{1}}

它是否同样的东西?我在文档中的任何地方都找不到哪个用于我的案例。如果在SO中已经涵盖了这一点我很抱歉,搜索让我无处可去。

2 个答案:

答案 0 :(得分:7)

<强>小心!表达身体属性将在每次调用时执行表达式 您可以在我的答案的最后部分看到示例。

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.

注意 - 这是危险的部分!

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

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.

答案 1 :(得分:3)

第一个是箭头函数,结果是一个返回常数值的函数:

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

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

第二个是自动属性,它会产生一个具有值&#34; bob&#34;的支持字段的getter:

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