gpt4 book ai didi

c# - C# 和 VB.NET 私​​有成员默认值的区别

转载 作者:行者123 更新时间:2023-11-30 14:43:49 27 4
gpt4 key购买 nike

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

  1. 具有虚拟 InitClass() 函数的基类
  2. 一个覆盖 InitClass() 函数的子类。在这个函数中我设置了一个私有(private)变量
  3. 公开我的私有(private)领域的公共(public)属性(property)

    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# 则相反(首先设置默认值,比构造函数被调用)。

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

最佳答案

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

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

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

关于c# - C# 和 VB.NET 私​​有成员默认值的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1411551/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com