这个问题已经有一个答案在这里:

我用来写作课是这样的:

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

这是不幸的,有没有办法这样做的权利。你必须设置的价值在构造。(使用constructor链接可以有助于避免工作重复。)

自动执行性质是方便的权利,但可以肯定会更好。我没有找到自己想要这种初始化往往作为一个只读自动实施的财产只能设置的构造,并将支持通过一个只读领域。

这并没有发生直到和包括C#5,但是正在计划C第6-无论是在条件允许的初始化的宣言》, 允许只读自动实现的属性进行初始化中的一个构造身体。

其他提示

你可以做到这一通过的构造你的班:

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

如果你已经有了另一个构造(即,一个需要参数)或一堆的构造你总是可以有这种(所谓的构造chaining):

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;

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

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

这是没有那么快,你的原始代码我相信,由于这是发生了什么幕后无论如何。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top