2008-10-03 49 views
160

我已经习惯了写作课是这样的:初始化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"; 
+1

是否有一个特别的原因,你不想在构造函数中完成它,因为它似乎是我自然的地方。 – 2008-10-03 23:01:55

+13

仅仅因为我之前不需要在构造函数中完成它。因此,如果我不得不添加一个构造函数,它不会节省我的任何努力。 – dlamblin 2008-10-03 23:04:59

+5

如果它是静态私人字符串...?然后你不想在构造函数中进行初始化,因为每次创建新对象时都会调用它,这不是特别想要的。 ~~~ – 2011-11-23 12:05:13

回答

173

更新 - 下面的答案是在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计划 - 在允许在声明点初始化时,允许只读自动实现的属性被初始化在构造函数体中。

3

在默认的构造函数(和任何非默认的,如果你有太多的任何课程):

public foo() { 
    Bar = "bar"; 
} 

这是无论如何,我相信您的原始代码的性能不会逊色,因为这是幕后发生的事情。

public class foo { 
    public foo(){ 
    Bar = "bar"; 
    } 
    public string Bar {get;set;} 
} 

如果你有另一个构造函数(即,一种采用paramters)或一串构造函数,你总是可以有这个(称为构造函数:

34

你可以通过你的类的构造函数做链接):

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;} 
} 

如果你总是连锁默认的构造函数的调用,你可以拥有所有默认属性初始化设置在那里。链接时,链接的构造函数将在调用构造函数之前调用,以便更专业的构造函数可以根据需要设置不同的默认值。

22

它将在C#6中成为可能。0:

public int Y { get; } = 2;