如何给C#自动属性一个初始值?
我要么使用构造函数,要么恢复到旧语法。
使用构造函数:
class Person
{
public Person()
{
Name = "Initial Name";
}
public string Name { get; set; }
}
使用普通属性语法(具有初始值)
private string name = "Initial Name";
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
有更好的方法吗?
除了已经接受的答案外,对于要将默认属性定义为其他财产的函数的场景,您可以在C#6.0(及更高版本)上使用表达式体表示法来实现更优雅、更简洁的结构,如:
public class Person{
public string FullName => $"{First} {Last}"; // expression body notation
public string First { get; set; } = "First";
public string Last { get; set; } = "Last";
}
您可以按以下方式使用以上内容
var p = new Person();
p.FullName; // First Last
p.First = "Jon";
p.Last = "Snow";
p.FullName; // Jon Snow
为了能够使用上述“=>”表示法,属性必须是只读的,并且不使用get accessor关键字。
MSDN上的详细信息
在C#5和更早版本中,要给自动实现的财产一个初始值,必须在构造函数中完成。
从C#6.0开始,您可以在线指定初始值。语法为:
public int X { get; set; } = x; // C# 6 or higher
DefaultValueAttribute用于VS设计器(或任何其他使用者)指定默认值,而不是初始值。(即使在设计对象中,初始值也是默认值)。
在编译时,DefaultValueAttribute不会影响生成的IL,并且不会读取该属性以将属性初始化为该值(请参阅DefaultValue属性不适用于我的自动属性)。
影响IL的属性示例有ThreadStaticAttribute、CallerMemberNameAttribute。。。
除了已经接受的答案外,对于要将默认属性定义为其他财产的函数的场景,您可以在C#6.0(及更高版本)上使用表达式体表示法来实现更优雅、更简洁的结构,如:
public class Person{
public string FullName => $"{First} {Last}"; // expression body notation
public string First { get; set; } = "First";
public string Last { get; set; } = "Last";
}
您可以按以下方式使用以上内容
var p = new Person();
p.FullName; // First Last
p.First = "Jon";
p.Last = "Snow";
p.FullName; // Jon Snow
为了能够使用上述“=>”表示法,属性必须是只读的,并且不使用get accessor关键字。
MSDN上的详细信息