在 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; } } } }
该程序的控制台输出是“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#,则相反(首先设置默认值,而不是构造函数叫做)。
谁能解释我为什么会这样?两种语言中的哪一种是“正确的”?