为什么派生类的字段初始值设定项在基类的初始值设定项之前执行

Var*_*n K 5 c# oop inheritance

构造函数按照从上到下依次执行IE基础的顺序执行,然后是派生的.这个安排是基于一个重要的OOP保证,即一个对象(这里是base)必须始终在它被使用之前被初始化(这里是派生类的构造函数).

我想知道为什么字段初始化程序在C#中不遵循这个原则?我在这里错过了什么吗?

我已经通过字段初始化器遇到了这个原理的有用性.我有一个基类,其属性返回Identity对象.每个派生类都有自己的存储库字段,我一直使用field-initializer初始化(使用默认构造函数).最近我决定还必须为存储库类提供Identity对象,因此我在存储库构造函数中引入了一个额外的参数.但我坚持要发现:

public class ForumController : AppControllerBase
{
        ForumRepository repository = new ForumRepository(Identity);
    // Above won't compile since Identity is in the base class.

   // ... Action methods.
}
Run Code Online (Sandbox Code Playgroud)

现在我只剩下一个选项,即使用默认构造函数来填充我的每个控制器,仅用于使用Identity初始化存储库对象.

Guf*_*ffa 0

字段初始化程序在构造函数中执行,并且由于首先调用基类中的构造函数,因此所有字段初始化程序也会在派生构造函数执行之前执行。

例子:

public class Base {

  // field initialiser:
  private string _firstName = "Arthur";

  public string FirstName { get { return _firstName;}}
  public string LastName { get; private set; }

  // initialiser in base constructor:    
  public Base() {
    LastName = "Dent";
  }

}

public class Derived : Base {

  public string FirstNameCopy { get; private set; }
  public string LastNameCopy { get; private set; }

  public Derived() {
    // get values from base class:
    FirstNameCopy = FirstName;
    LastNameCopy = LastName;
  }

}
Run Code Online (Sandbox Code Playgroud)

测试:

Derived x = new Derived();
Console.WriteLine(x.FirstNameCopy);
Console.WriteLine(x.LastNameCopy);
Run Code Online (Sandbox Code Playgroud)

输出:

Arthur
Dent
Run Code Online (Sandbox Code Playgroud)