初始化C#自动性能
问题描述:
我已经习惯了写作课是这样的:初始化C#自动性能
public class foo {
private string mBar = "bar";
public string Bar {
get { return mBar; }
set { mBar = value; }
}
//... other methods, no constructor ...
}
转换杆到自动属性看起来很方便,简洁,但我怎么能留住初始化不添加一个构造函数,并把那里的初始化?
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";
答
更新 - 下面的答案是在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计划 - 在允许在声明点初始化时,和允许只读自动实现的属性被初始化在构造函数体中。
答
在默认的构造函数(和任何非默认的,如果你有太多的任何课程):
public foo() {
Bar = "bar";
}
这是无论如何,我相信您的原始代码的性能不会逊色,因为这是幕后发生的事情。
public class foo {
public foo(){
Bar = "bar";
}
public string Bar {get;set;}
}
如果你有另一个构造函数(即,一种采用paramters)或一串构造函数,你总是可以有这个(称为构造函数:
答
你可以通过你的类的构造函数做链接):
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;}
}
如果你总是连锁默认的构造函数的调用,你可以拥有所有默认属性初始化设置在那里。链接时,链接的构造函数将在调用构造函数之前调用,以便更专业的构造函数可以根据需要设置不同的默认值。
答
它将在C#6中成为可能。0:
public int Y { get; } = 2;
是否有一个特别的原因,你不想在构造函数中完成它,因为它似乎是我自然的地方。 – 2008-10-03 23:01:55
仅仅因为我之前不需要在构造函数中完成它。因此,如果我不得不添加一个构造函数,它不会节省我的任何努力。 – dlamblin 2008-10-03 23:04:59
如果它是静态私人字符串...?然后你不想在构造函数中进行初始化,因为每次创建新对象时都会调用它,这不是特别想要的。 ~~~ – 2011-11-23 12:05:13