Я имею сталкивающийся с ситуацией в VB.NET и C#.N(ET2) с видимостью статических/общих участников. Это кажется мне немного странным в 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 нет статических членов
: VB имеет ключевое слово Shared
, что означает, что член является 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# мы высоко ценим определение языка, которое делает подозрительными незаконные паттерны; так как нет смысла передавать экземпляр в качестве приемника статическому методу (если только вычисление выражения приемника не приводит к побочному эффекту), то зачем разрешать пользователю печатать бессмысленный код?
В команде разработчиков VB ценят код, работающий так, как вы хотели, чтобы он работал при первом вводе; если что-то выглядит немного неаккуратно, может быть, предупредите, но позвольте ему и двигайтесь дальше.
Если вас интересуют некоторые из наиболее тонких проблем в дизайне статических вызовов на C#, вот интересный вопрос:
http://blogs.msdn.com/ericlippert/archive/2009/07/06/color-color.aspx
Компилятор C# не позволит вам ссылаться на статическое свойство на экземпляре объекта, только на сам тип. Это скорее C#, чем ограничение .NET CLR. VB.NET это разрешит, но предупредит об этом.
.