212

我习惯于编写这样的类:

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";
4

4 回答 4

249

更新 - 下面的答案是在 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# 5)并没有发生,但正计划在 C# 6 中进行 - 无论是允许在声明点进行初始化,还是允许在构造函数主体中初始化只读自动实现的属性。

于 2008-10-04T06:38:02.283 回答
36

你可以通过你的类的构造函数来做到这一点:

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

如果您始终将调用链接到默认构造函数,则可以在此处设置所有默认属性初始化。链接时,链接的构造函数将在调用构造函数之前调用,以便您更专业的构造函数能够设置不同的默认值。

于 2008-10-03T23:06:09.327 回答
30

这在 C# 6.0 中是可能的:

public int Y { get; } = 2;
于 2014-08-29T20:55:32.753 回答
3

在默认构造函数中(当然还有任何非默认构造函数):

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

我相信这与您的原始代码一样具有性能,因为无论如何这都是幕后发生的事情。

于 2008-10-03T23:04:44.570 回答