vb.net — вопросы с ответами

Объектная ориентация

VB.NET – это язык программирования, предназначенный для создания приложений, работающих с платформой Microsoft .NET Framework. Платформа .NET, в свою очередь, устраняет многие ограничения "классической" COM, объектной модели компонентов Microsoft, которая обеспечивает единый подход к взаимодействию приложений и компонентов. Эти ограничения включали несовместимость типов при вызове COM-компонентов, трудности с версиями (DLL hell) при разработке новых версий COM-компонентов и необходимость для разработчиков писать определенный объем кода (в основном на C++) для обработки COM. Из-за взаимодействия с COM VB.NET предлагает ряд новых функций и преимуществ.

С выпуском четвертой версии Visual Basic в него добавили поддержку классов и модулей классов, в связи с чем в процессе он стал объектно-ориентированным языком программирования. Тем не менее продолжаются споры о том, является ли Visual Basic "истинным" объектно-ориентированным языком или он поддерживает только ограниченные возможности объектной ориентации.

Дискуссия сосредоточена вокруг поддержки Visual Basic наследования, концепции объектно-ориентированного программирования, которая позволяет классу получать свои свойства и функциональность от другого класса. Сторонники точки зрения, что Visual Basic является объектно-ориентированным языком, указывают на поддержку Visual Basic для интерфейсного программирования и использование виртуальных базовых классов. И все же сравнительно немного программистов на VB пользуются преимуществами программирования на основе интерфейса. А само программирование на основе интерфейса не позволяет производному классу наследовать функциональность базового класса; только виртуальные базовые классы могут быть унаследованы с помощью ключевого слова Implements.

Хотя объектно-ориентированный характер предыдущих версий VB может вызывать споры, нет сомнений в том, что VB.NET является объектно-ориентированным языком программирования. На самом деле, даже если VB.NET используется для написания того, что кажется процедурным кодом, он, так сказать, объектно-ориентированный "под капотом".

Общая система типов

Традиционно, одна из проблем вызова подпрограмм, написанных на других языках из Visual Basic, или вызова подпрограмм Visual Basic из других языков состоит в том, что такие межъязыковые вызовы предполагают систему общего типа. Это имеет место при вызове функций Win32 API из Visual Basic, но это также относится к попыткам вызова методов в компоненте COM VB из других языков или для вызова методов в сторонних компонентах COM из VB.

Например, до добавления оператора AddressOf, который позволяет нам передавать указатель на функцию или подпрограмму, не было никакого способа предоставить функцию обратного вызова, которая требуется большинством функций перечисления Win32 API. В качестве другого примера, ожидается, что члены структур, переданных в функции Win32 API, будут выровнены по своим естественным границам, что было очень трудно для программистов VB.

Проблемы совместимости типов чаще всего возникали, когда скриптовые приложения использовались для вызова и передачи аргументов COM-компонентам. Отличным примером является попытка передать массив из сценария, написанного на JScript, в компонент COM, поскольку COM рассматривает массивы JScript как строку значений, разделенных запятыми, а не как COM-совместимый массив (называемый SafeArray).

Платформа .NET устраняет эти трудности, предоставляя общую систему типов. В конечном итоге все типы данных являются либо классами, либо структурами, определенными или унаследованными от библиотеки классов .NET Framework. Эта система общего типа означает, что компоненты .NET будут действительно независимыми от языка, и что компонент .NET, написанный на одном языке, будет легко взаимодействовать с компонентами .NET, написанными на любом другом языке .NET. Проблема несовместимых типов просто исчезает.

На первый взгляд, VB сохранил свою старую систему типов. Например, VB по-прежнему поддерживает тип данных Long, хотя теперь он представляет собой 64-разрядный тип данных вместо 32-разрядного типа данных VB 4 – VB 6. Случайная проверка кода, показанного в примере ниже, свидетельствует о том, что VB сохранил свою систему типов. Однако если мы используем ILDASM для проверки IL, сгенерированного из этого кода Visual Basic, мы увидим, что типы данных VB являются просто оболочками для типов данных, предоставляемых .NET Framework.

В следующем примере программа также поддерживает этот вывод. Программа создает целое число типа Long, стандартного типа данных Visual Basic. Затем она вызывает метод ToString – метод класса Int64 для преобразования этого числа в его строковое представление. Другими словами, переменная примере действительно является типом данных Int64, маскирующимся под традиционный тип данных VB Long.

Доступ к системным службам: библиотека классов фреймворка

С тех пор, как VB добавил поддержку для вызовов подпрограмм в API Windows и Win32, многие программисты Visual Basic стали рассматривать API-программирование как разновидность "черной магии". Не только запутанный и, казалось бы, безграничный массив функций, которые можно вызывать, но и передача параметров подпрограммам и получение их возвращаемых значений часто казались очень загадочным процессом. Более того, с растущим акцентом на объектно-ориентированное программирование, Win32 API с его функциональным подходом к программированию казался все более и более архаичным.

Хотя оператор Declare остается в VB, и программисты по-прежнему могут вызывать Win32 API и подпрограммы в других внешних библиотеках Windows, многие из общих системных служб, предоставляемых Win32 API, а также некоторыми компонентами COM, теперь предоставляются .NET Framework Class Library. Framework Class Library – это коллекция типов (классы, структуры, интерфейсы, делегаты и перечисления), организованных в пространства имен.

Общая среда исполнения

Хотя VB традиционно защищает разработчика от многих сложностей Windows как операционной системы или COM как метода взаимодействия, тем не менее, некоторые небольшие знания о том, как работает система, все же необходимы, иначе разработчик наверняка рано или поздно столкнется с проблемой. Например, рассмотрим следующий фрагмент кода для VB 6:

Из-за идиосинкразии VB объекты, объявленные и созданные с использованием ключевого слова New в той же строке кода, фактически не создаются до первой ссылки на этот объект. В результате наша попытка определить, является ли объект oObj значением Nothing, воссоздает объект, и наш cleanup code никогда не выполняется.

В .NET многие подобные проблемы устраняются благодаря общеязыковой среде выполнения (CLR) платформы .NET. CLR, как понятно из его названия, предоставляет различные сервисы приложениям и процессам, работающим на платформе .NET, независимо от языка, на котором они были изначально написаны. Эти сервисы включают управление памятью и сборку мусора. Они также включают в себя унифицированную систему обработки исключений, которая позволяет использовать один и тот же набор средств отладки для всего кода, независимо от конкретного языка .NET, на котором он был написан.

Переменные и типы данных

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

Переменные

Переменная может быть определена как сущность, которая имеет следующие шесть свойств:

  1. Имя. Имя переменной используется для идентификации переменной в коде. В VB.NET имя переменной может начинаться с алфавитного символа Unicode или знака подчеркивания, и за ним могут следовать дополнительные символы подчеркивания или различные символы Unicode, например алфавитные, числовые, форматирующие или комбинированные символы.
  2. Адрес. Каждая переменная имеет связанный адрес памяти, который является местом в памяти, в котором хранится значение переменной. Обратите внимание, что во многих случаях адрес переменной будет меняться в течение срока ее службы, поэтому было бы опасно делать какие-либо предположения относительно этого адреса.
  3. Тип. Тип переменной, также называемый типом данных, определяет возможные значения, которые может принимать переменная.
  4. Значение. Значением переменной является содержимое ячейки памяти по адресу переменной. Это также иногда называют r-значением переменной, поскольку это то, что действительно отображается с правой стороны оператора присваивания.
  5. Область видимости. Область видимости переменной определяет, где в программе эта переменная видна коду.
  6. Время жизни. Время жизни переменной определяет, когда и как долго существует конкретная переменная. Она может быть или не быть видимой (то есть находиться в области видимости) в течение всего этого периода.

Подробнее следует остановиться на области видимости и времени жизни переменных.

Область видимости

Если переменная объявлена внутри блока кода (набор операторов, который заканчивается оператором End ..., Loop или Next), тогда переменная имеет область видимости уровня блока; то есть она видна только внутри этого блока.

Например, рассмотрим следующий код:

В этом коде переменная rec не распознается за пределами блока, в котором она определена, поэтому последний оператор выдает ошибку.

Время жизни переменной

Переменные также имеют время жизни. Разница между временем жизни и областью видимости довольно проста. Время жизни относится к тому, когда или в какое время во время выполнения программы переменная является действительной; область видимости – это то, где в программе переменная распознается кодом.

Чтобы проиллюстрировать разницу, рассмотрим следующую процедуру:

Обратите внимание, что LocalVar является локальной переменной. Когда выполняется строка "Call ProcedureB" выполнение переключается на процедуру B. В то время как строки Процедуры B выполняются, переменная LocalVar находится вне области видимости, поскольку она является локальной для Процедуры A. Но она все еще в силе. Другими словами, переменная все еще существует и имеет значение. Она просто не доступно для кода в процедуре B. Фактически, у MethodB также может быть локальная переменная с именем LocalVar, которая не будет иметь ничего общего с переменной с тем же именем в процедуре A.

1 ответ
Из-за нового проекта в VBA я перешел с VB.NET, честно говоря, не знаю, как справляться между классами объектов здесь. То, что я хочу достичь, - это сравнение объектов между различными объектными модулями класса. например Сотрудник класса       свойства: Name, Age       точка: сравнить Name между...
class
interface
comparison
09 нояб. 2013, в 19:09
11 ответов
столбец А имеет такие данные (т.е. частые пустые ячейки): HEADING <-- this is A1 kfdsl fdjgnm fdkj gdfkj 4353 fdjk <-- this is A9 Я хотел бы иметь возможность получить ссылку на ячейку последней ячейки, у которой есть данные. Поэтому в приведенном выше примере я хочу вернуться: A9 Я пробо...
excel
excel-interop
10 июнь 2011, в 03:16
34 ответа
У меня есть код и когда он выполняется, он выдает NullReferenceException, говоря: Ссылка на объект не установлена ​​в экземпляр объекта. Что это значит и что я могу сделать, чтобы исправить эту ошибку?
null
nullreferenceexception
11 янв. 2011, в 17:29
5 ответов
Я пытаюсь получить ленивую оценку с помощью "И" в своем макросе Excel, выполнив следующее: If Not myObject Is Nothing *And* myObject.test() Then 'do something' Else 'do something else' End If Я знаю, что ленивая оценка существует в VB.NET как AndAlso и OrElse, но не может найти ничего подоб...
14 июль 2010, в 00:49
9 ответов
Я использую ключевое слово Call при вызове subs в VB/VBA. Я знаю, что это необязательно, но лучше ли использовать его или оставить его? Я всегда думал, что это было более явным, но, возможно, это просто шум. Кроме того, я читаю это на другом форуме: использование ключевого слова Call выполняется быс...
call
vb6
04 апр. 2010, в 05:10
13 ответов
Я не пытаюсь начать здесь аргумент, но по какой-то причине он обычно утверждал, что Visual Basic нечувствителен к регистру, а языки C - нет (и как-то это хорошо). Но вот мой вопрос: где именно нечувствителен регистр Visual Basic? Когда я печатаю... Dim ss As String Dim SS As String ... в Visual Stu...
case-sensitive
case-insensitive
20 фев. 2010, в 02:35
12 ответов
Является ли плохой практикой использование двоеточий для размещения двух операторов в одной строке в Visual Basic?
vb6
11 сен. 2009, в 15:18
9 ответов
На другом связанном с программированием веб-сайте я увидел эту строку в чьей-то подписи. Это не первый раз, когда я видел такие чувства, хотя это самый жесткий: "Люди, которые работают в VB или любом варианте это не программисты, они цирковые шимпанзе бросали фекалии в IDE..." VBA - мой хлеб и м...
28 авг. 2009, в 20:50
26 ответов
Мне нравится создавать экземпляры моих клиентов службы WCF в блоке using, поскольку он в значительной степени является стандартным способом использования ресурсов, реализующих IDisposable: using (var client = new SomeWCFServiceClient()) { //Do something with the client } Но, как отмечено в эт...
wcf
wcf-client
using
21 фев. 2009, в 22:43
19 ответов
В большинстве языков программирования словари предпочтительнее хэш-таблиц. В чем причины этого?
data-structures
19 нояб. 2008, в 07:44
11 ответов
Как включить ведение журнала сбоев привязки сборки (Fusion) в .NET?
binding
assemblies
01 нояб. 2008, в 09:51
26 ответов
Я собираюсь добавить раздел в приложение ASP.NET(VB.NET codebehind), которое позволит пользователю получить данные, возвращенные им в виде файла Excel, которые я буду генерировать на основе данных базы данных. Хотя есть несколько способов сделать это, у каждого свои недостатки. Как бы вы вернули дан...
export-to-excel
29 сен. 2008, в 19:15
12 ответов
У меня есть приложение .NET, которое имеет разные файлы конфигурации для сборки Debug и Release. Например. файл debug app.config указывает на развитие SQL Server, в котором включена отладка, а цель релиза - на Live SQL Server. Существуют и другие настройки, некоторые из которых отличаются от debug/r...
configuration
25 сен. 2008, в 11:49
10 ответов
Если мне задан MemoryStream, который, как я знаю, был заполнен с помощью String, как мне получить String обратно?
string
memorystream
16 сен. 2008, в 22:51
14 ответов
Около 6 месяцев назад я развернул сайт, где каждый запрос должен был превышать https. Единственный способ в то время, когда я мог найти, чтобы каждый запрос страницы был выше https, состоял в том, чтобы проверить это в событии загрузки страницы. Если запрос не был выше http, я бы ответил response.re...
https
webforms
05 сен. 2008, в 23:25
Наверх
Меню