Understanding C# field initialization requirements(了解 C# 字段初始化要求)
问题描述
考虑以下代码:
public class Progressor
{
private IProgress<int> progress = new Progress<int>(OnProgress);
private void OnProgress(int value)
{
//whatever
}
}
这会在编译时出现以下错误:
This gives the following error on compilation:
字段初始值设定项不能引用非静态字段、方法或属性Progressor.OnProgress(int)"
A field initializer cannot reference the non-static field, method, or property 'Progressor.OnProgress(int)'
我理解它所抱怨的限制,但我不明白为什么这是一个问题,但是可以在构造函数中初始化该字段,而不是如下:
I understand the restriction it is complaining about, but I don't understand why it is an issue, but the field can be initialized in the constructor instead as follows:
public class Progressor
{
private IProgress<int> progress;
public Progressor()
{
progress = new Progress<int>(OnProgress);
}
private void OnProgress(int value)
{
//whatever
}
}
C# 中需要此限制的字段初始化与构造函数初始化有什么区别?
What is the difference in C# regarding the field initialization vs constructor initialization that requires this restriction?
推荐答案
字段初始化在基类构造函数调用之前,所以它不是一个有效的对象.此时,任何以 this
作为参数的方法调用都会导致无法验证的代码,如果不允许使用无法验证的代码,则会抛出 VerificationException
.例如:在安全透明代码中.
Field initialization come before base class constructor call, so it is not a valid object. Any method call with this
as argument at this point leads to unverifiable code and throws a VerificationException
if unverifiable code is not allowed. For example: in security transparent code.
- 10.11.2 实例变量初始化器
当实例构造函数没有构造函数初始值设定项,或者它具有 base(...) 形式的构造函数初始值设定项时,该构造函数隐式执行由在其类中声明的实例字段的变量初始值设定项指定的初始化.这对应于在进入构造函数时和直接基类构造函数的隐式调用之前立即执行的一系列赋值.变量初始化器按照它们在类声明中出现的文本顺序执行. - 10.11.3 构造函数执行
变量初始化器被转换为赋值语句,并且这些赋值语句在基类实例构造函数的调用之前执行.这种排序可确保所有实例字段在执行任何有权访问该实例的语句之前由其变量初始化程序初始化.
这篇关于了解 C# 字段初始化要求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:了解 C# 字段初始化要求


- 如何用自己压缩一个 IEnumerable 2022-01-01
- WebMatrix WebSecurity PasswordSalt 2022-01-01
- 良好实践:如何重用 .csproj 和 .sln 文件来为 CI 创建 2022-01-01
- MoreLinq maxBy vs LINQ max + where 2022-01-01
- C# 中多线程网络服务器的模式 2022-01-01
- 带有服务/守护程序应用程序的 Microsoft Graph CSharp SDK 和 OneDrive for Business - 配额方面返回 null 2022-01-01
- C#MongoDB使用Builders查找派生对象 2022-09-04
- Web Api 中的 Swagger .netcore 3.1,使用 swagger UI 设置日期时间格式 2022-01-01
- 在哪里可以找到使用中的C#/XML文档注释的好例子? 2022-01-01
- 输入按键事件处理程序 2022-01-01