关于初始化:初始化C#auto-properties

Initializing C# auto-properties

本问题已经有最佳答案,请猛点这里访问。

我习惯于写这样的课程:

1
2
3
4
5
6
7
8
public class foo {
  private string mBar ="bar";
  public string Bar {
    get { return mBar; }
    set { mBar = value; }
  }
  //... other methods, no constructor ...
}

将bar转换为auto属性似乎既方便又简洁,但是如何在不添加构造函数和将初始化放在其中的情况下保留初始化?

1
2
3
4
5
6
public class foo2theRevengeOfFoo {
  //private string mBar ="bar";
  public string Bar { get; set; }
  //... other methods, no constructor ...
  //behavior has changed.
}

您可以看到,添加一个构造函数并不符合我应该从自动属性中获得的工作节省。

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

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


更新-下面的答案是在C 6出现之前写的。在C 6中,你可以写:

1
2
3
4
public class Foo
{
    public string Bar { get; set; } ="bar";
}

还可以写入只读的自动实现的属性,这些属性只能在构造函数中写入(但也可以给定默认初始值:

1
2
3
4
5
6
7
8
9
public class Foo
{
    public string Bar { get; }

    public Foo(string bar)
    {
        Bar = bar;
    }
}

不幸的是现在没有办法做到这一点。必须在构造函数中设置值。(使用构造函数链接有助于避免重复。)

自动实现的属性现在很方便,但肯定会更好。我发现自己不希望这种初始化像一个只读的自动实现的属性那样频繁,它只能在构造函数中设置并由只读字段支持。

这在c 5之前(包括c 5)都没有发生,但计划在c 6中进行,这两个方面都允许在声明点进行初始化,并允许在构造函数体中初始化只读自动实现的属性。


您可以通过类的构造函数来完成:

1
2
3
4
5
6
public class foo {
  public foo(){
    Bar ="bar";
  }
  public string Bar {get;set;}
}

如果您有另一个构造器(即,一个接受参数的构造器)或一组构造器,那么您可以始终拥有它(称为构造器链接):

1
2
3
4
5
6
7
8
9
10
11
12
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中可能有:

1
public int Y { get; } = 2;

在默认构造函数中(当然,如果您也有任何非默认的构造函数):

1
2
3
public foo() {
    Bar ="bar";
}

我相信这和您的原始代码一样有着同样的性能,因为不管怎样,这就是幕后发生的事情。