了解C#字段初始化要求

义斋

考虑以下代码:

public class Progressor
{
    private IProgress<int> progress = new Progress<int>(OnProgress);

    private void OnProgress(int value)
    {
        //whatever
    }
}

编译时出现以下错误:

字段初始值设定项不能引用非静态字段,方法或属性'Progressor.OnProgress(int)'

我了解它在抱怨的限制,但是我不明白为什么这是一个问题,但是可以在构造函数中初始化字段,如下所示:

public class Progressor
{
    private IProgress<int> progress;

    public Progressor()
    {
         progress =  new Progress<int>(OnProgress);
    }

    private void OnProgress(int value)
    {
        //whatever
    }
}

C#在字段初始化与构造函数初始化(需要此限制)方面有什么区别?

用户名

字段初始化在基类构造函数调用之前进行,因此它不是有效的对象。此时,任何以thisas为参数的方法调用都将导致无法验证的代码,并且VerificationException如果不允许进行不可验证的代码,则会引发例如:在安全透明代码中。

  • 10.11.2实例变量初始值设定项
    当实例构造函数没有构造函数初始值设定项,或者它具有base(...)形式的构造函数初始值设定项时,该构造函数将隐式执行由其实例中声明的实例字段的变量初始值设定项指定的初始化。类。这对应于分配的序列,该分配的序列在进入构造函数后立即执行,并在隐式调用直接基类构造函数之前执行。变量初始化器按照它们在类声明中出现的文本顺序执行。
  • 10.11.3构造函数的执行将
    变量初始化器转换为赋值语句,并在调用基类实例构造函数之前执行这些赋值语句。这种顺序可确保在执行对​​实例具有访问权限的任何语句之前,所有实例字段均由其变量初始值设定项初始化。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章