C#和VB.NET之间私有成员默认值的差异

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();

在C#中,我有以下代码:

  • 具有虚拟InitClass()函数的基类
  • 重写InitClass()函数的子类。在这个函数中,我设置了一个私有变量
  • 公开我私人领域的公共财产

    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; }
            }
        }
    }
    
  • 此程序的控制台输出为“在InitClass()中设置”

    现在我将这段代码转换为VB.NET

    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.NET

    VB.NET方法允许字段初始值设定项引用正在构造的对象。