Нотация удара и запись через точку в VBA и доступе MS

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

Существует ли различие или предпочтение к использованию того или другого? Некоторый простой поиск с помощью Google только показывает ограниченную информацию о предмете с некоторыми людьми, на самом деле использующими его в противоположных случаях. Возможно, существует раздел стандартов кодирования от MS где-нибудь, который указывает на метод безумия?

25
задан Community 23 May 2017 в 12:26
поделиться

1 ответ

Оператор bang (! ) является сокращением для доступа к членам Collection или другого перечислимого объекта, такого как Fields свойство ADODB.Recordset.

Например, вы можете создать Коллекцию и добавить в нее несколько элементов с ключами:

Dim coll As Collection
Set coll = New Collection

coll.Add "First Item", "Item1"
coll.Add "Second Item", "Item2"
coll.Add "Third  Item", "Item3"

Вы можете получить доступ к элементу этой коллекции по его ключу тремя способами:

  1. coll.Item("Item2")
    Это наиболее явная форма.

  2. coll("Item2")
    Это работает, потому что Item является методом по умолчанию класса Collection, поэтому его можно опустить.

  3. coll!Item2
    Это сокращение для обеих приведенных выше форм. Во время выполнения VB6 берет текст после bang и передает его в качестве параметра методу Item.

Люди, кажется, делают это сложнее, чем должно быть, поэтому трудно найти простое объяснение. Обычно сложности или "причины не использовать оператор bang" возникают из-за непонимания того, насколько он прост на самом деле. Когда у кого-то возникают проблемы с оператором bang, они склонны винить его вместо того, чтобы найти истинную причину проблемы, которая часто бывает более тонкой.

Например, некоторые люди рекомендуют не использовать оператор bang для доступа к элементам управления на форме. Так, Me.txtPhone предпочтительнее, чем Me!txtPhone. "Причина", по которой это считается плохим, заключается в том, что Me.txtPhone будет проверяться на корректность во время компиляции, а Me!txtPhone - нет.

В первом случае, если вы ошибочно напечатаете код как Me.txtFone, а элемента управления с таким именем не существует, ваш код не скомпилируется. Во втором случае, если вы написали Me!txtFone, вы не получите ошибку компиляции. Вместо этого ваш код взорвется с ошибкой времени выполнения, если он достигнет строки кода, в которой использовался Me!txtFone.

Проблема с аргументом против оператора bang заключается в том, что эта проблема не имеет никакого отношения к самому оператору bang. Он ведет себя именно так, как и должен.

Когда вы добавляете элемент управления к форме, VB автоматически добавляет свойство к вашей форме с тем же именем, что и у элемента управления, который вы добавили. Это свойство является частью класса формы, поэтому компилятор может проверять опечатки во время компиляции, если вы обращаетесь к элементам управления с помощью оператора dot (".") (а вы можете обращаться к ним с помощью оператора dot именно потому, что VB создал для вас именованное свойство элемента управления).

Поскольку Me!ControlName на самом деле является сокращением для Me.Controls("ControlName")1, не стоит удивляться тому, что вы не получаете никаких проверок времени компиляции против неправильного ввода имени элемента управления.

Другими словами, если оператор bang "плохой", а оператор dot "хороший", то вы можете подумать, что

Me.Controls("ControlName")

лучше

Me!ControlName

потому что в первой версии используется точка, но в данном случае точка совсем не лучше, поскольку вы по-прежнему обращаетесь к имени элемента управления через параметр. Это "лучше" только тогда, когда есть альтернативный способ написать код так, чтобы получить проверку во время компиляции. Это происходит с элементами управления, поскольку VB создает свойства для каждого элемента управления, и именно поэтому Me.ControlName иногда рекомендуется вместо Me!ControlName.


  1. Первоначально я заявил, что свойство Controls является свойством по умолчанию класса Form, но Дэвид указал в комментариях, что Controls не является свойством по умолчанию класса Form. Фактическое свойство по умолчанию возвращает коллекцию, которая включает содержимое Me.Controls, поэтому сокращение bang все еще работает.
27
ответ дан 28 November 2019 в 18:17
поделиться
Другие вопросы по тегам:

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