C#和VB.NET之间私有成员默认值的差异
在C#中,我有以下代码:C#和VB.NET之间私有成员默认值的差异,c#,vb.net,default,C#,Vb.net,Default,在C#中,我有以下代码: 具有虚拟InitClass()函数的基类 重写InitClass()函数的子类。在这个函数中,我设置了一个私有变量 公开我私人领域的公共财产 namespace InheritenceTest { class Program { static void Main(string[] args) { ChildClass childClass = new ChildClass();
namespace InheritenceTest
{
class Program
{
static void Main(string[] args)
{
ChildClass childClass = new ChildClass();
Console.WriteLine(childClass.SomeString);
Console.ReadLine();
}
}
public class BaseClass
{
public BaseClass()
{
InitClass();
}
protected virtual void InitClass()
{
// Do Nothing here
}
}
public class ChildClass: BaseClass
{
private string _someString = "Default Value";
public ChildClass()
{
}
protected override void InitClass()
{
base.InitClass();
_someString = "Set in InitClass()";
}
public string SomeString
{
get { return _someString; }
set { _someString = value; }
}
}
}
Imports System
Imports System.Collections.Generic
Imports System.Text
Namespace InheritenceTest
Module Program
Public Sub Main(ByVal args As String())
Dim childClass As New ChildClass()
Console.WriteLine(childClass.SomeString)
Console.ReadLine()
End Sub
End Module
Public Class BaseClass
Public Sub New()
InitClass()
End Sub
Protected Overridable Sub InitClass()
' Do Nothing here
End Sub
End Class
Public Class ChildClass
Inherits BaseClass
Private _someString As String = "Default Value"
Public Sub New()
End Sub
Protected Overrides Sub InitClass()
MyBase.InitClass()
_someString = "Set in InitClass()"
End Sub
Public Property SomeString() As String
Get
Return _someString
End Get
Set(ByVal value As String)
_someString = value
End Set
End Property
End Class
End Namespace
此VB.NET程序的输出为“默认值”
在调试时查看代码(VB.NET代码)时,您会看到,当构造函数完成其工作时,会设置默认值,而对于C#,则相反(首先设置默认值,然后调用构造函数)
谁能解释一下为什么会这样?这两种语言中哪一种是“正确的”?这两种语言在处理这个特定问题的方式上完全不同 至于为什么会像C#那样做,你应该看看Eric关于这个主题的博客系列
至于VB.Net中的原因。我不完全清楚VB.Net为什么选择这种特殊的方法。我的即兴猜测可能是VB6的兼容性问题,但我甚至不确定VB6是否有类似的情况 除了@JaredPar
VB.NET不同初始化方案的唯一原因是因为VB从过去开始就是这样设计的,如果他们在VB.NET中改变这个顺序,从VB迁移到VB.NET的程序员将遇到困难,并且可能会出现一些兼容性问题,因为您仍然能够将大部分旧VB代码导入VB.NETVB.NET方法允许字段初始值设定项引用正在构造的对象。