=> 常量与 { get; 之间的区别} =常数
Difference between => constant to { get; } = constant
在最佳实践和性能(如果有的话)的上下文中,在 C# 6+ 样式属性中将设置或计算一次的值公开为 属性 有什么更好的方法?
我比较expression bodied properties
public string Name => "bob";
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 ;
}
}
注意 - 这是危险的部分!
请注意,每次调用时都会执行表达式主体属性。当它 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;
}
}
如您所见,这里的列表只初始化了一次。
在最佳实践和性能(如果有的话)的上下文中,在 C# 6+ 样式属性中将设置或计算一次的值公开为 属性 有什么更好的方法?
我比较expression bodied properties
public string Name => "bob";
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 ;
}
}
注意 - 这是危险的部分!
请注意,每次调用时都会执行表达式主体属性。当它 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;
}
}
如您所见,这里的列表只初始化了一次。