我习惯了这样写类:

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

您可以看到,添加构造函数与我应该从auto-properties中节省的精力并不内联。

这样的话对我来说更有意义:

public string Bar { get; set; } = "bar";

当前回答

你可以通过类的构造函数来实现:

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

如果总是将调用链接到默认构造函数,则可以在那里设置所有默认属性初始化。在进行链接时,被链接的构造函数将在调用构造函数之前被调用,以便您的更专门的构造函数能够根据需要设置不同的默认值。

其他回答

更新:下面的答案是在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 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;}
}

如果总是将调用链接到默认构造函数,则可以在那里设置所有默认属性初始化。在进行链接时,被链接的构造函数将在调用构造函数之前被调用,以便您的更专门的构造函数能够根据需要设置不同的默认值。

这将在c# 6.0中实现:

public int Y { get; } = 2;

在默认构造函数(以及任何非默认构造函数,如果你也有的话)中:

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

我相信这并不亚于您的原始代码,因为这是发生在幕后的事情。