Устранение неполадок, связанных с переменными, в 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.
См. также раздел
- Переменные
- Объявление переменной
- Объектные переменные
- Объявление объектной переменной
- Практическое руководство. Доступ к членам объекта
- Значения объектных переменных
- Практическое руководство. Определение типа, на который указывает объектная переменная
- References to Declared Elements
- Declared Element Names