为什么C#在基础构造函数之前设置私有变量,而VB.NET则相反?

Rob*_* P. 13 .net c# vb.net

有一个问题比较C#代码和VB.NET,看似相同的代码之间的结果是完全不同的.(我编写了一个程序,允许两个类"战斗".无论出于何种原因,C#总能获胜.BB.NET有什么问题?)

给出的解释是C#将初始化类字段,然后调用基础构造函数,但VB.NET完全相反.

我的问题是 - 为什么?

这些语言有不同的技术原因吗?乍一看,似乎任何一种方法都同样有效,但我无法理解为什么他们不会选择相同的方法.

编辑:正如'Jeffrey L Whitledge'指出的那样,VB6没有继承,所以我认为我们不能说'保持VB.NET和VB6更紧密相关'.

sup*_*cat 2

基构造函数可以在派生类构造函数运行之前将对象公开给外界。虽然人们通常应该避免这样做,但有时这是必要的。例如,一个人可能有两个对象,它们保存对彼此的引用,并且每个对象可能具有类不变量,即对另一个对象的引用必须有效。创建这样的一对对象需要让一个对象的构造函数将部分构造的对象传递给另一个对象,或者让一个对象的构造函数在满足其类不变量之前返回。

如果派生类字段初始值设定项在基类构造函数运行之后才运行,并且如果基类构造函数将对象暴露给外部世界,则意味着该对象将在任何派生类之前暴露给外部世界。类初始化已经发生。C# 的创建者不喜欢这个想法,因此他们让派生类初始值设定项在基类构造函数之前运行。

另一方面,在基类构造函数之前运行派生类初始值设定项有一个缺点:这些初始值设定项无法对正在构造的对象进行任何引用。他们也无法使用传递给构造函数的任何参数。在将控制权移交给基类构造函数之前对对象进行部分初始化可能会很好,但是对于如何初始化它有一些严格的限制;在运行基本构造函数之前,对象可能处于完全有用的状态,也可能不可能。

vb.net 的创建者显然认为,由于在基本构造函数之前运行初始化程序并不能消除处理暴露给外界的部分构造对象的需要,并且由于它阻止了一些有用技术的使用,因此更好让初始化器在基本构造函数之后运行。这使得基级构造函数可以将其参数之一公开为字段,然后让派生类在派生类字段初始值设定项中使用该字段的值。

可以说,C# 方法允许人们做 vb.net 所做不到的事情,但反之则不然(人们可以通过简单地写入构造函数开头的字段来实现 vb 样式的字段初始值设定项)。另一方面,将字段的声明和初始化放在一起比在一个地方进行声明和在其他地方进行初始化要干净得多。遗憾的是,这两种语言都不允许指定某些特定字段声明应遵循与规范相反的范例。