C#和VB.NET之间的区别是私有成员的默认值

3 c# vb.net default

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

  1. 具有虚拟InitClass()函数的基类
  2. 一个覆盖InitClass()函数的子类.在这个函数中我设置了一个私有变量
  3. 公共财产暴露我的私人领域

    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; }
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

此程序的控制台输出是"在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
Run Code Online (Sandbox Code Playgroud)

该VB.NET程序的输出是"默认值".

在调试时查看代码(VB.NET代码)时,您会看到当构造函数完成它的工作时,会设置默认值,而对于C#,则是另一种方式(首先设置默认值,而不是构造函数)叫做).

任何人都可以解释为什么会这样吗?哪两种语言"正确"?

Jar*_*Par 5

这两种语言在解决这一特定问题的方式上略有不同.

至于为什么这样做是在C#中完成的,你应该查看Eric关于这个主题的博客系列

至于VB.Net中的原因.我不完全确定VB.Net选择这种特殊方法的原因.我的袖口猜测是VB6兼容性问题,但我甚至不确定VB6是否有类似的情况.