在调用基类型构造函数之前,是否可以强制VB.NET初始化实例变量?

Cod*_*ray 27 .net vb.net constructor initialization c#-to-vb.net

在VB.NET中调试一个涉及初始化实例变量的顺序的特别棘手的问题之后,我发现我期望从C#开始的行为与VB.NET中的实际行为之间存在突破性差异.

Nota bene:这个问题涉及VB.NET和C#的行为略有不同.如果你是一个无法提供答案的语言偏执,而不是"这就是为什么你应该使用C#,noob",那么你在这里看不到任何东西; 和睦相处.

具体来说,我期望C#语言规范概述的行为(重点增加):

当实例构造函数没有构造函数初始化程序,或者它具有表单的构造函数初始值设定项时base(...),该构造函数隐式执行由其类中声明的实例字段的变量初始值设定项指定的初始化.这对应于在进入构造函数之后和直接调用直接基类构造函数之前立即执行的赋值序列.变量初始值设定项以它们出现在类声明中的文本顺序执行.

与有关实例构造函数的VB.NET语言规范部分形成对比,该部分说明(强调添加):

当构造函数的第一个语句是表单时MyBase.New(...),构造函数隐式执行由类型中声明的实例变量的变量初始值设定项指定的初始化.这对应于在调用直接基类型构造函数后立即执行的赋值序列.这样的排序可确保在执行有权访问实例的任何语句之前,所有基本实例变量都由其变量初始化程序初始化.

这里的差异立即显而易见.C#调用基础构造函数之前初始化类级变量.VB.NET完全相反,显然更喜欢设置实例字段的值之前调用基础构造函数.

如果你想看一些代码,这个相关的问题提供了一个更具体的例子,说明不同的行为.不幸的是,它没有提供关于如何强制VB.NET遵循C#建立的模型的任何提示.

我不太感兴趣为什么这两种语言的设计者选择这种不同的方法而不是我可能的问题解决方法.最后,我的问题如下:有没有办法在VB.NET中编写或构造我的代码,以便调用基类型的构造函数之前强制实例变量初始化,这是C#中的标准行为?

Dam*_*ver 8

如果您有构建期间要调用的虚拟成员(针对最佳建议,但我们已经同意),那么您需要将初始化移动到一个单独的方法中,以防止多次调用(即, init已经发生,立即返回).然后,虚拟成员和构造函数将在依赖发生初始化之前调用该方法.

它有点乱,并且可能代表轻微的性能损失,但在VB中你几乎无能为力.