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

このプログラムからのコンソール出力は「SetinInitClass()」です。

次に、このコードを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#の場合はその逆であることがわかります(最初にコンストラクターよりもデフォルト値が設定されます)と呼ばれます)。

なぜこれが当てはまるのか誰かが私に説明できますか?そして、2つの言語のどちらが「正しい」ですか?

4

2 に答える 2

5

2つの言語は、この特定の問題へのアプローチ方法が単純に異なります。

これが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 に答える