我习惯写这样的课程:
public class foo {
private string mBar = "bar";
public string Bar {
get { return mBar; }
set { mBar = value; }
}
//... other methods, no constructor ...
}
将Bar转换为自动属性似乎既方便又简洁,但是如何在不添加构造函数并将初始化放在那里的情况下保留初始化?
public class foo2theRevengeOfFoo {
//private string mBar = "bar";
public string Bar { get; set; }
//... other methods, no constructor ...
//behavior has changed.
}
你可以看到添加一个构造函数并不符合我应该从自动属性中获得的省力。
这样的事情对我来说更有意义:
public string Bar { get; set; } = "bar";
答案 0 :(得分:203)
更新 - 下面的答案是在C#6出现之前写的。在C#6中,你可以写:
public class Foo
{
public string Bar { get; set; } = "bar";
}
您可以还编写只读自动实现的属性,这些属性只能在构造函数中写入(但也可以给出默认的初始值:
public class Foo
{
public string Bar { get; }
public Foo(string bar)
{
Bar = bar;
}
}
不幸的是,现在没有办法做到这一点。您必须在构造函数中设置值。 (使用构造函数链接可以帮助避免重复。)
现在自动实现的属性非常方便,但肯定会更好。我发现自己不希望这种初始化像只读的自动实现的属性那样只能在构造函数中设置,并且只能由只读字段支持。
这种情况直到C#5都没有发生,但正在计划用于C#6 - 无论是在声明时允许初始化,还是和都允许自动执行只读要在构造函数体中初始化的属性。
答案 1 :(得分:34)
您可以通过班级的构造函数来完成:
public class foo {
public foo(){
Bar = "bar";
}
public string Bar {get;set;}
}
如果你有另一个构造函数(即一个带参数的构造函数)或一堆构造函数,你总是可以拥有它(称为构造函数链接):
public class foo {
private foo(){
Bar = "bar";
Baz = "baz";
}
public foo(int something) : this(){
//do specialized initialization here
Baz = string.Format("{0}Baz", something);
}
public string Bar {get; set;}
public string Baz {get; set;}
}
如果始终将调用链接到默认构造函数,则可以在此处设置所有默认属性初始化。链接时,将在调用构造函数之前调用链式构造函数,以便更专业的构造函数能够根据需要设置不同的默认值。
答案 2 :(得分:24)
可以在C#6.0中使用:
public int Y { get; } = 2;
答案 3 :(得分:3)
在默认构造函数中(如果你当然也有任何非默认构造函数):
public foo() {
Bar = "bar";
}
这与我相信的原始代码同样具有高效性,因为无论如何这都是幕后发生的事情。