В чем разница между Dim, Global, Public и Private как модульными модификаторами доступа к полю?

В VB6 / VBA вы можете объявлять переменные уровня модуля вне определенного Sub или Function метода. Я раньше использовал Private и Public внутри модулей и понимаю их так:

  • Public - виден всему коду внутри модуля и всему коду вне модуля, что по сути делает его глобальным.
  • Private - виден только коду внутри модуля.

Я заметил, что вы можете использовать Dim и Global в качестве модификаторов для модульных переменных. Отличаются ли Dim и Global от Private и Public соответственно при использовании в качестве модификаторов доступа к модульным полям? Если да, то чем они отличаются?


person Ben McCormack    schedule 28.09.2010    source источник


Ответы (1)


Dim и Private работают одинаково, хотя по общему соглашению Private используется на уровне модуля, а Dim - на уровне подчиненных / функций. Public и Global почти идентичны по своим функциям, однако Global можно использовать только в стандартных модулях, тогда как Public можно использовать во всех контекстах (модули, классы, элементы управления, формы и т. Д.) Global происходит из более старых версий VB и, вероятно, был сохранен для обратной совместимости, но был полностью заменен на Public.

person Joe Jordan    schedule 28.09.2010
comment
Спасибо за Ваш ответ. Ваше объяснение в значительной степени совпадает с тем, о чем я думал. Я начинаю с огромного блока устаревшего кода, в котором все четыре модификатора используются в разделах объявлений одного модуля. - person Ben McCormack; 28.09.2010
comment
Глобальные переменные сохраняют свое значение после выполнения. - person Kiril; 14.03.2015
comment
Сравнение ваших комментариев с интерактивной справкой по Excel 2010 выявляет несколько замечательных моментов: переменные, объявленные с помощью оператора Public, доступны для всех процедур во всех модулях всех приложений, если не действует Option Private Module; в этом случае переменные являются общедоступными только в рамках проекта, в котором они находятся. Более того, предостережение: оператор Public нельзя использовать в модуле класса для объявления строковой переменной фиксированной длины. Поскольку оба вышеперечисленных варианта использования неясны, ни один из них вряд ли представляет собой практическую проблему. Тем не менее, в интересах полноты. - person David A. Gray; 20.09.2015
comment
Хотя вопрос касается только объявлений на уровне модуля, для полноты (и для новичков) стоит прямо упомянуть, что Private и Public даже не допускаются внутри процедур. официальная документация оператора Private, похоже, имеет опечатку в этом отношении (он почти идентичен и, вероятно (?) скопирован из документации для оператора Dim): Когда вы используете оператор Private в [sic!] процедуре ... - person Egalth; 11.10.2018