Статический/Общий в VB.NET и C# Visibility
-
22-09-2019 - |
Вопрос
Я столкнулся с ситуацией в 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 позволит это, но предупредит против этого.