Разница между C # и VB.NET для значений по умолчанию частных членов - PullRequest
3 голосов
/ 11 сентября 2009

В 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 # это наоборот (сначала устанавливается значение по умолчанию, чем называется конструктор).

Может кто-нибудь объяснить мне, почему это так? А какой из 2 языков является "правильным"?

Ответы [ 2 ]

5 голосов
/ 11 сентября 2009

2 языка просто отличаются в подходе к этой конкретной проблеме.

Что касается того, почему это делается так, как это делается в C #, вам следует ознакомиться с серией блогов Эрика на эту тему

Что касается почему в VB.Net. Я не совсем уверен, почему VB.Net выбрал именно этот подход. Я предпочитаю предположить, что проблема совместимости VB6 будет, но я даже не уверен, что у VB6 были похожие сценарии.

1 голос
/ 11 сентября 2009

В дополнение к @ JaredPar

Единственная причина, по которой VB.NET отличается схемой инициализации, заключается в том, что VB был спроектирован таким же образом, как и в прошлом. Если бы они изменили эту последовательность в VB.NET, у программистов, переходящих с VB на VB.NET, возникли бы проблемы, а также некоторые проблемы совместимости может возникнуть, поскольку вы все еще можете импортировать большую часть старого кода VB в VB.NET

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...