Поделиться через


Устранение неполадок, связанных с переменными, в Visual Basic

На этой странице перечислены некоторые распространенные проблемы, которые могут возникнуть при работе с переменными в Visual Basic.

Не удается получить доступ к членам объекта

Если ваш код пытается получить доступ к свойству или методу объекта, могут возникнуть две следующие ошибки.

  • Компилятор может создать сообщение об ошибке, если вы объявляете переменную объекта с определенным типом и затем ссылаетесь на член, не определенный этим типом.

  • MemberAccessException времени выполнения возникает, когда объект, присвоенный переменной объекта, не является элементом, доступ к которому пытается получить код. В случае с переменной Object Data Typeэто исключение также возникает, если член не является Public. Это происходит потому, что позднее связывание разрешает доступ только к членам Public .

Когда Option Strict Statement задает для проверки типа значение On, переменная объекта может получать доступ только к методам и свойствам класса, в котором она объявлена. Это показано в следующем примере.

Dim p As Object = New System.Windows.Forms.Label
Dim q As System.Windows.Forms.Label = New System.Windows.Forms.Label
Dim j, k As Integer
' The following statement generates a compiler error.
j = p.Left
' The following statement retrieves the left edge of the label 
' in pixels.
k = q.Left

В этом примере p может использовать только члены класса Object без свойства Left . С другой стороны, q был объявлен с типом Label, поэтому он может использовать все методы и свойства класса Label в пространстве имен System.Windows.Forms .

Правильный подход

Чтобы иметь возможность доступа ко всем членам объекта определенного класса, объявите переменную объекта с типом этого класса, если это возможно. В противном случае, например если вы не знаете тип объекта во время компиляции, необходимо задать Option Strict значение Off и объявить переменную с типом Object Data Type. В этом случае переменной могут быть присвоены объекты любого типа, а вы должны выполнить действия, чтобы убедиться, что текущий назначенный объект имеет допустимый тип. Для этого можно использовать оператор TypeOf .

Другие компоненты не могут получить доступ к переменной

В именах Visual Basic регистр не учитывается. Если два имени отличаются только регистром букв, компилятор интерпретирует их как одно и то же. Например, он считает, что ABC и abc являются одним и тем же объявленным элементом.

Однако среда CLR использует привязку с учетом регистра . Таким образом, при создании сборки или DLL и предоставлении к ней доступа другим сборкам, в именах регистр учитываться не будет. Например, если определен класс с элементом ABCи другие сборки используют класс с помощью среды CLR, они должны ссылаться на элемент как на ABC. Если впоследствии вы перекомпилируете класс и измените имя элемента на abc, другие сборки, использующие класс, больше не смогут обращаться к этому элементу. Таким образом, при выпуске обновленной версии сборки нельзя изменять регистр имен открытых элементов.

Для получения дополнительной информации см. Common Language Runtime.

Правильный подход

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

Используется неправильная переменная

При наличии нескольких переменных с одинаковыми именами компилятор Visual Basic пытается разрешить каждую ссылку на это имя. Если переменные имеют различные области действия, компилятор разрешает ссылку на объявление с самой узкой областью. Если они имеют одну и ту же область действия, разрешение не выполняется и компилятор сообщает об ошибке. Для получения дополнительной информации см. References to Declared Elements.

Правильный подход

Избегайте использования переменных с одинаковыми именами, но разными областями действия. При работе с другими сборками или проектами избегайте использования любых имен, определенных в их внешних компонентах, насколько это возможно. При наличии нескольких переменных с одним и тем же именем необходимо уточнить каждую ссылку на такую переменную. Для получения дополнительной информации см. References to Declared Elements.

См. также раздел