Вопрос

Я столкнулся с ситуацией в VB.NET и C# (.NET2) с видимостью статических/общих участников. Мне кажется немного странным в vb.net:

    public class A 
    {
        private static A instance;
        public static A Instance 
        {
            get { return instance; }
        }

        public string Name { get { } }
    }

Применение: A.Instance.Name // Единственное имя "видимо"


VB.NET:

Public Class A
  Private Shared _instance As A

  Public Shared ReadOnly Property Instance() As A
    Get
      Return _instance
    End Get
  End Property


  Public ReadOnly Property Name() As String
    Get
      Return ""
    End Get
  End Property

End Class

Применение:

A.Instance.Instance.Instance.Instance...

// общий член ведет себя как классная публичная, я могу повторить его бесконечно.

Это надзор за Microsoft или функция VB.net "?

Это было полезно?

Решение

Это не надзор, а ваш код VB будут Запустите предупреждение, которое ясно означает: не используйте это обозначение.

В VB, статические члены Можно получить доступ через экземпляр, так как строго говоря, VB нет static: VB имеет ключевое слово Shared, это означает, что участник общий между всеми случаями, в отличие от static где член не принадлежит Любые пример.

Теперь это семантическое различие между этими ключевыми словами. Так получилось, что эти две различные семантики, как правило, имеют такой же эффект.

Конечно, static В C# сегодня идентично Shared В vb.net, но их наследие другое, а VB Shared Просто имеет другую историю и, следовательно, исторически другое значение. С это Значит, это абсолютно смысл получить доступ Shared Участники через экземпляр.

Это также имеет смысл при использовании вместе с Option Strict Off (Свободный набор): Здесь иногда иногда не знаю тип переменной, но вы все равно захотите получить доступ к Shared член. Теперь у вас нет выбора, кроме как использовать экземпляр для доступа к нему:

Option Strict Off
' … '
Dim o As Object = New A()
' Somewhere else, we want to access a static member of A but we don’t know A: '
Dim instance = o.Instance

Другие советы

Это функция; Это не ошибка. VB работает так, как спроектировано. Различные языки делают разные варианты о том, можно ли рассматриваться статический метод как метод экземпляра или нет. VB позволяет это. C ++ позволяет это. C# нет.

Помните, что критерии дизайна разных языков разные, и поэтому принятые решения разные. В команде дизайнеров C# мы очень ценим языковое определение, которое делает незаконные шаблоны, которые выглядят подозрительно; Так как нет значение Для передачи экземпляра в качестве приемника к статическому методу (если не вычисляет выражение приемника, вызывает побочный эффект), то почему пользователь позволяет пользователю вводить бессмысленный код?

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

Если вы заинтересованы в некоторых из самых тонких проблем в дизайне статических вызовов в C#, вот интересная проблема:

http://blogs.msdn.com/ericlippert/archive/2009/07/06/color-color.aspx

Компилятор C# не позволит вам ссылаться на статическое свойство на экземпляре объекта, только на самом типе. Это C#, а не ограничение .NET CLR. VB.NET позволит это, но предупредит против этого.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top