C#:构造函数和字段初始化执行顺序

时间:2017-02-03 03:48:48

标签: c#

public class RegisterViewModel{
  public RegisterViewModel()
        {
            MaxDepartmentLevel = db.Settings.Find(1).MaxDepartmentLevel;
        }

        private ApplicationDbContext db = new ApplicationDbContext();

        public int MaxDepartmentLevel { get; set; } 


}

这样安全吗?是否可以保证在行

之前初始化db

MaxDepartmentLevel = db.Settings.Find(1).MaxDepartmentLevel;跑吗?

换句话说,具有字段初始化和构造函数的类的执行顺序是什么?

2 个答案:

答案 0 :(得分:1)

简短回答:是的,您的“db”字段将始终在构造函数之前初始化(假设没有继承)。

长答案:在构造函数中执行数据库调用(几乎)绝不是一个好主意。构造函数应该只“构造”类,而不是执行它的操作。我会改变你的代码

public class RegisterViewModel{
    private ApplicationDbContext db;

    public RegisterViewModel()
    {
        db = new ApplicationDbContext();
    }

    public int QueryMaxDepartmentLevel => db.Settings.Find(1).MaxDepartmentLevel;

}

它可以控制数据库查询的执行时间:)

答案 1 :(得分:0)

任何构造函数都会调用父构造函数,然后在执行代码之前初始化成员变量。因此代码可以工作。

初始化顺序通常是:

  1. this()调用
  2. 时的成员变量或同一类的其他构造函数
  3. 父构造函数(在this()调用的情况下跳过)
  4. 提供的自定义代码
  5. 请参阅https://msdn.microsoft.com/en-us/library/aa645606(v=vs.71).aspx