статический/Общий в VB.NET и видимости C#

Я имею сталкивающийся с ситуацией в 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 «особенность»?

9
задан serhio 30 December 2009 в 15:29
поделиться

3 ответа

Это не ошибка, но ваш 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
20
ответ дан 4 December 2019 в 07:14
поделиться

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

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

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

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

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

11
ответ дан 4 December 2019 в 07:14
поделиться

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

.
0
ответ дан 4 December 2019 в 07:14
поделиться