Свойства по умолчанию в VB.NET?

29
задан svick 5 June 2013 в 14:12
поделиться

6 ответов

Ну, платформа.NET действительно имеет понятие участника по умолчанию. Ключевые компоненты являются классом DefaultMemberAttribute и Типом. GetDefaultMembers (). В VB.NET, определяя участника по умолчанию часть синтаксиса языка:

  Public Class Sample
    Private mValue As Integer
    Default Public ReadOnly Property Test(ByVal index As Integer) As Integer
      Get
        Return index
      End Get
    End Property
  End Class

Использование это как это:

  Sub Main()
    Dim s As New Sample
    Console.WriteLine(s(42))
    Console.ReadLine()
  End Sub

компилятор реализует это путем испускания [DefaultMember] автоматически. Это однако имеет ограничение, свойство должно иметь индексный аргумент, конкретно для предотвращения неоднозначности синтаксиса. Это ограничение не осуществляется при определении атрибута явно:

  <System.Reflection.DefaultMember("AnotherTest")> _
  Public Class Sample
    Public ReadOnly Property AnotherTest() As Integer
      Get
        Return 42
      End Get
    End Property
  End Class

, Но что участник по умолчанию только был бы доступен как значение по умолчанию языком, который позволяет такой синтаксис. Для которого я не знаю примера в.NET, это использовалось назад в дни COM, как VB6. Также базовая причина позади VB6, имеющего ключевое слово Набора, это решает неоднозначность и указывает, что "Я имею в виду объект, не свойство объекта по умолчанию". Очень болезненная деталь синтаксиса для многих начинающих программистов Visual Basic тогда.

C# имеет те же самые правила, но не позволяет тот же вид гибкости. Вы, вероятно, видели индексатор прежде:

  public class Sample {
    public int this[int index] {
      get { return index; }
    }
  }

Этот код также делает выход компилятора [DefaultMember] атрибут. Именованным свойством в том атрибуте является "Объект". И вот почему Вы видите индексатор, зарегистрированный и индексируемый в MSDN Library как "Объект".

30
ответ дан Hans Passant 28 November 2019 в 01:24
поделиться

В этом примере это вытягивает объект, но не преобразовывает его в целое число.

Brian, я не вижу, почему Ваш желаемый эффект не может быть достигнут с помощью Widening Operator CType. Код, который Вы показали нам , может быть сделанным работать. Однако остерегайтесь неявных преобразований. Они обычно не хорошая идея.

5
ответ дан Konrad Rudolph 28 November 2019 в 01:24
поделиться

Нет, это было явно удалено из VB 7.

то, Когда у Вас есть длинная цепочка свойств по умолчанию, зная точно, что будет возвращено, твердо. То, когда и b и c имеют Foo метод, a.Foo(1) средний a.b.Foo(1) или a.b.c.Foo(1)?

настоящая строка над заголовком была Set. Путем отбрасывания свойств по умолчанию они также смогли отбросить Set ключевое слово для объектного присвоения.

5
ответ дан Mark Hurd 28 November 2019 в 01:24
поделиться

Существует DefaultProperty атрибут, таким образом, Ваш пример должен быть корректным, , но это, кажется, для компонентов, которые используются в разработчике Windows Forms.

1
ответ дан hangy 28 November 2019 в 01:24
поделиться

Для ответа на мой собственный вопрос перегрузка оператора, казалось, была интересным решением здесь.

В конце, это не был подходящий вариант.

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

поэтому даже с этим, я не могу сказать:

Dim x as Integer = MyObject.Stats(Stat.Health)... В этом примере это вытягивает объект, но не преобразовывает его в целое число, поэтому конечно, результатом является исключение.

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

2
ответ дан Bridge 28 November 2019 в 01:24
поделиться

Вы могли переопределить метод ToString к выходному значению как строка так, чтобы, когда Вы делаете Ответ. Запишите (MyObject), Вы получаете тот же эффект.

    Public Overrides Function ToString() As String
        Return Me.Value.ToString 
    End Function

[РЕДАКТИРОВАНИЕ] Теперь, когда я понимаю его лучше, почему не только позволяют добираться непосредственно в значениях содержащих в нем объектов.

Public Class MyClass
    Private m_Stats(100) As Stats  ' or some other collection'

    Public Property StatValue(ByVal stat_number As Integer) As _
        Integer
        Get
            Return m_Stats(stat_number)
        End Get
        Set(ByVal Value As Integer)
            m_Stats(stat_number) = Value
        End Set
    End Property
End Class
1
ответ дан tvanfosson 28 November 2019 в 01:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: