3

在 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; }
            }
        }
    }
    

该程序的控制台输出是“Set in 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#,则相反(首先设置默认值,而不是构造函数叫做)。

谁能解释我为什么会这样?两种语言中的哪一种是“正确的”?

4

2 回答 2

5

这两种语言只是在处理这个特定问题的方式上有所不同。

至于为什么以 C# 的方式完成此操作,您应该查看 Eric 关于该主题的博客系列

至于为什么在 VB.Net 中。我不完全确定为什么 VB.Net 选择了这种特殊的方法。我的即兴猜测将是一个 VB6 兼容性问题,但我什至不确定 VB6 是否有类似的情况。

于 2009-09-11T15:16:47.210 回答
1

除了@JaredPar

VB.NET不同的初始化方案的唯一原因是因为VB过去就是这样设计的,如果他们在VB.NET中改变这个顺序,程序员从VB迁移到VB.NET将会遇到困难,并且可能会出现一些兼容性问题您仍然可以将大部分旧 VB 代码导入 VB.NET

于 2009-09-11T15:20:56.187 回答