c# - 为什么 C# 在基本构造函数之前设置私有(private)变量,而 VB.NET 却相反?

标签 c# .net vb.net

有一个问题比较 C# 代码和 VB.NET,看似相同的代码之间的结果完全不同。 ( I wrote a program that allow two classes to "fight". For whatever reason C# always wins. What's wrong with VB.NET? )

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

我的问题是 - 为什么?

语言不同是否有技术原因?乍一看,这两种方法似乎都同样有效,但我不明白为什么他们不会选择相同的方法。

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

最佳答案

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

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

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

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

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

关于c# - 为什么 C# 在基本构造函数之前设置私有(private)变量,而 VB.NET 却相反?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5187092/

相关文章:

c# - .NET 中的反序列化问题

.net - 将 UnmanagedMemoryStream 转换为字节数组

.net - VB .NET SQL 删除查询不起作用

c# - GDI+ 图像比 C# 图像快得多

c# - 将 ValidationControls 动态添加到 updatepanel? [ASP.NET]

c# - .NET MVC 应用程序中所有 HTTP GET 操作的 OnActionExecuted 代码

vb.net - 无法弄清楚语法错误是什么

c# - 如何在 Array.Resize 期间防止 OutOfMemory 异常?

c# - 让用户不属于任何角色的更好方法?

c# - 为什么 IList 不支持 AddRange