有一个问题是比较 C# 代码和 VB.NET,看似相同的代码之间的结果完全不同。
(我写了一个程序,允许两个类“打架”。无论出于何种原因,C# 总是获胜。 VB.NET 有什么问题? https://stackoverflow.com/questions/711586/why-c-is-always-winning-over-vb-net)
给出的解释是,C# 将初始化类字段,然后调用基本构造函数,但 VB.NET 的做法恰恰相反。
我的问题是——为什么?
语言不同是否有技术原因?乍一看,似乎这两种方法都同样有效,但我无法理解为什么他们不选择相同的方法。
编辑:正如“Jeffrey L Whitledge”所指出的,VB6 没有继承,所以我认为我们不能说“让 VB.NET 和 VB6 保持更紧密的相关性”。
基构造函数可以在派生类构造函数运行之前将对象公开给外界。虽然人们通常应该避免这样做,但有时这是必要的。例如,一个人可能有两个对象,它们保存对彼此的引用,并且每个对象可能具有类不变量,即对另一个对象的引用必须有效。创建这样的一对对象需要让一个对象的构造函数将部分构造的对象传递给另一个对象,或者让一个对象的构造函数在满足其类不变量之前返回。
如果派生类字段初始值设定项在基类构造函数运行之后才运行,并且如果基类构造函数将对象暴露给外部世界,则意味着该对象将在任何派生类之前暴露给外部世界。类初始化已经发生。 C# 的创建者不喜欢这个想法,因此他们让派生类初始值设定项在基类构造函数之前运行。
另一方面,在基类构造函数之前运行派生类初始值设定项有一个缺点:这些初始值设定项无法对正在构造的对象进行任何引用。他们也无法使用传递给构造函数的任何参数。在将控制权移交给基类构造函数之前对对象进行部分初始化可能会很好,但是对于如何初始化它有一些严格的限制;在运行基本构造函数之前,对象可能处于完全有用的状态,也可能不可能。
vb.net 的创建者显然认为,由于在基本构造函数之前运行初始化程序并不能消除处理暴露给外界的部分构造对象的需要,并且由于它阻止了一些有用技术的使用,因此更好让初始化器在基本构造函数之后运行。这使得基级构造函数可以将其参数之一公开为字段,然后让派生类在派生类字段初始值设定项中使用该字段的值。
可以说,C# 方法允许人们做 vb.net 所做不到的事情,但反之则不然(人们可以通过简单地写入构造函数开头的字段来实现 vb 样式的字段初始值设定项)。另一方面,将字段的声明和初始化放在一起比在一个地方进行声明和在其他地方进行初始化要干净得多。遗憾的是,这两种语言都不允许指定某些特定字段声明应遵循与规范相反的范例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)