【问题标题】:Difference between => constant to { get; } = constant [duplicate]=> 常量与 { get; 之间的区别} = 常数 [重复]
【发布时间】:2018-03-08 10:59:10
【问题描述】:

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

我在比较expression bodied properties

public string Name => "bob";

auto-property initialisation

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

它对同样的东西脱糖吗?我在文档中找不到说明我的案例使用哪个的任何地方。如果这已经包含在 SO 中,我深表歉意,搜索让我无处可去。

【问题讨论】:

  • 遗憾的是,副本的答案并没有回答仅设置一次值的细节,下面的答案完全回答了我的问题。

标签: c# c#-6.0


【解决方案1】:

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

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.

【讨论】:

  • 说得好,谢谢。微妙之处在于{get;} = 设置了支持字段:)​​
  • 很高兴为您提供帮助 :-)
【解决方案2】:

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

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

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

第二个是自动属性,它产生一个带有值“bob”的支持字段的getter:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 2015-12-15
    • 2021-08-27
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多