Сводка: Обзор того, как функция My предоставляет функциональные возможности .NET Framework, включая доступные классы, динамически создаваемые классы и многопоточность.
Примечание. Эта статья и пример кода основаны на предварительной версии Microsoft Visual Studio 2005 (ранее под кодовым названием «Whidbey»). Вся информация, содержащаяся здесь, может быть изменена. Для примера проекта требуется Visual Studio2005Beta1 или более поздняя версия.
Введение
My — это новая функция Visual Basic 2005, которая предоставляет часто используемые функции под рукой и сокращает количество строк кода, которые вам нужно написать. Это делается эффективным, надежным и потокобезопасным способом. В среде, где производительность программистов особенно важна, My может помочь вам выполнить работу быстрее. В этом суть Visual Basic.
Цель этой статьи — изучить, как использовать My для доступа к функциям и элементам .NET Framework в вашем проекте.
Классы .NETFramework доступны на странице Мой
Поскольку в .NET Framework задействовано так много всего, может быть сложно найти нужную вам функциональность. Чтобы решить эту проблему, My предоставляет точки входа в часто используемые классы и функции .NET Framework. My также предоставляет новые высокоуровневые классы .NET Framework, которые объединяют связанные функциональные возможности в API-интерфейсы на основе задач.
My предоставляет функциональные возможности, возвращая класс .NETFramework, экземпляр которого создан и готов к использованию, откладывает вызовы методов .NETFramework и возвращает динамически создаваемые классы, которые можно использовать для доступа к элементам вашего проекта.
Прямо публично
Когда это возможно, My служит механизмом обнаружения существующих классов в .NET Framework и напрямую предоставляет эти типы. См. следующий пример My.application.Deployment:
PublicReadOnlyPRpertyDeployment()As_
System.Deployment.ApplicationDeployment
Получать
Возвращаться_
System.Deployment.ApplicationDeployment.CurrentDeployment
КонецGet
Конепроперти
Другие примеры прямого воздействия включают My.Computer.FileSystem.OpenTextFileReader() (который возвращает System.IO.StreamReader), My.Application.OpenForms() (который возвращает System.Windows.Forms.FormsCollection), My.User (который возвращает System.Security.Principal.IPrincipal) и т. д.
Появление
My также может возвращать новые классы, предоставляющие API на основе задач для выполнения операций, которые раньше было трудно выполнить, поскольку поиск функциональных возможностей был затруднен и/или требовал совместной работы нескольких объектов.
Общие задачи, требующие использования низкоуровневого API .NET Framework или нескольких строк кода, значительно упрощаются. См. следующий пример задачи, чтобы определить, доступно ли сетевое подключение:
ImportsSystem.Net.NetworkInformation
PublicReadOnlyPropertyIsAvailable()AsBoolean
Получать
ForEachNetInterfaceAsNetworkInterfaceIn_
NetworkInterface.GetAllNetworkInterfaces()
IfNetInterface.Type<>InterfaceType.Loopback_
AndAlsoNetInterface.Type<>InterfaceType.Tunnel_
AndAlsoNetInterface.OperationalStatus=_
OperationalStatus.UpThen
ВозвратИстина
КонецЕсли
Следующий
ВозвратЛожь
КонецGet
Конепроперти
Приведенный выше код требует детального знания нескольких типов в пространстве имен System.Net.NetworkInformation. Используя шаблон внешнего вида, My.Computer.Network сводит эти типы и их отношения к одной строке кода: My.Computer.Network.IsAvailable().
Внешний вид также может просто объединить связанные функции, которые в противном случае было бы трудно найти. Например, My.Computer объединяет свойства из разных классов, чтобы предоставить имя компьютера и доступ к экрану:
PublicReadOnlyPropertyName()AsString
Получать
ReturnSystem.Environment.MachineName
КонецGet
Конепроперти
PublicReadOnlyPropertyScreen()AsSystem.Windows.Forms.Screen
Получать
ReturnSystem.Windows.Forms.Screen.PrimaryScreen
КонецGet
Конепроперти
Другие примеры классов в My, которые объединяют связанные функциональные возможности из нескольких типов .NET Framework, включают My.Application, My.Computer, My.Computer.FileSystem, My.Computer.Info и My.Application.Info.
Прокси-класс
Прокси-класс — это очень «тонкий» класс, который перенаправляет все вызовы к нему базовому объекту. Например, если вы вызываете My.Computer.Clipboard.GetText(), вы фактически вызываете метод прокси-класса ClipboardProxy.GetText(), определенный следующим образом:
PublicFunctionGetText()AsString
ВозвратКлипборда.ПолучитьТекст()
Конечнаяфункция
По соглашению прокси-классы всегда имеют суффикс Proxy. My использует прокси-серверы при доступе к буферу обмена, файловой системе и реестру, поскольку базовые классы, предоставляемые прокси-серверами, состоят из общих методов, невидимых в IntelliSense. Пользователь не может создать экземпляр класса Proxy. Тестирование производительности показало, что переадресация звонков через прокси не имеет смысла.
Динамически генерируемые классы
В соответствии с целью «предоставить вам функциональность под рукой» My предоставляет доступ к формам, веб-службам, ресурсам и настройкам, определенным в вашем проекте. Например, если ваш проект содержит ссылку на веб-службу MapDirections, вы можете использовать веб-службу немедленно, не зная, как запустить экземпляр прокси-сервера веб-службы. Просто введите следующее: My.WebServices.MapDirections.GetDirections(...)
Как это работает? Фабричные классы генерируются компилятором, который по запросу возвращает лениво созданные экземпляры для форм, веб-сервисов, настроек и ресурсов вашего проекта. Фабричный класс адаптирован для возврата экземпляров способом, подходящим для типа проекта (exe/dll/web), в котором выполняется ваш код. Более подробную информацию смотрите в разделе «Потоки».
Мои.Формы
В качестве примера динамически создаваемого класса рассмотрим My.Forms. Этот класс предоставляется вам и определяет фабричные методы для каждой формы вашего проекта. Когда вы получаете доступ к форме через My.Forms.Form1, фабричный метод проверяет, открыт ли уже экземпляр Form1. Если экземпляр уже открыт, этот экземпляр возвращается. В противном случае создается и возвращается экземпляр Form1. Сгенерированный код проекта, содержащего Form1, выглядит следующим образом:
КлассMyForms
'Код, выделенный жирным шрифтом, созданный компилятором
Publicm_Form1AsForm1
Пабликпропертиформ1 () как форма1
Получать
m_Form1=Create__Instance__(OfForm1)(m_Form1)
Возвратm_Form1
КонецGet
Установить (Бивалвалуэасформ1)
ЕслиValueIsm_Form1
Возвращаться
КонецЕсли
ЕслиNotValueIsNothingThen
ThrowNewArgumentException(_
Свойству можно задать только значение Nothing.)
КонецЕсли
Dispose__Instance__(OfForm1)(m_Form1)
Конечный набор
Конепроперти
Конечныйкласс
Функция Create__Instance__() отвечает за создание экземпляров формы по требованию. Он проверяет, был ли создан экземпляр формы (хранящейся в m_Form1). Если форма уже создана, форма возвращается. В противном случае экземпляр создается и возвращается. Create__Instance__() также фиксирует попытки создания рекурсивной формы. Dispose__Instance__() отвечает за закрытие формы.
My.Forms также предоставляет метод для повторного представления экземпляра формы по умолчанию, с которым вы, возможно, знакомы по более ранним версиям Visual Basic. Экземпляры по умолчанию позволяют ссылаться на экземпляр формы без предварительного явного создания экземпляра формы.
Например, в Visual Basic 6.0 вместо этого вы могли бы написать Form1.Show():
DimForm1InstanceasForm1
Form1Instance=newForm1
Форма1Экземпляр.Показать()
Поскольку компилятор Visual Basic 2005 использует My.Forms для создания экземпляров по умолчанию, вы можете просто написать Form1.Show().
Мой.ВебСервисы
Одна из трудностей, с которыми люди сталкиваются при кодировании веб-сервисов, — это определение того, для какого класса следует кодировать. My.WebServices исключает этот процесс определения и предоставляет экземпляры прокси-серверов веб-служб по требованию.
My.WebServices лучше всего подходит для синхронных вызовов веб-служб. Шаблон кода, созданный для предоставления экземпляра прокси-сервера веб-службы, аналогичен шаблону кода, показанному для возврата экземпляра формы.
Мои.Настройки
Новым в Visual Basic 2005 является конструктор настроек, который позволяет указывать параметры приложения для каждого приложения или пользователя. Конструктор создает класс, который вы можете использовать для доступа к своим настройкам строго типизированным способом. Вы можете увидеть пример класса MySettings, отобразив все файлы в обозревателе решений и найдя файл MySettings.vb в узле MySettings.Settings.
Ниже приведен пример свойства, созданного для управления параметром приложения с именем SampleUserSetting:
Партиалнотинхеритаблеклассмисеттингс
InheritsSystem.Configuration.ApplicationSettingsBase
<System.Diagnostics.DebuggerNonUserCode(),_
System.Configuration.UserScopedSettingAttribute(),_
System.Configuration.DefaultSettingValueAttribute(TryMe)>_
PublicPropertySampleUserSetting()AsString
Получать
ReturnCType(Me(SampleUserSetting),String)
КонецGet
Набор
Me(SampleUserSetting)=значение
Конечный набор
Конепроперти
Конечныйкласс
Сгенерированные классы сделают всю тяжелую работу за вас. Чтобы получить доступ к этой настройке, просто введите:
My.Settings.SampleUserSetting
Мои.Ресурсы
Еще одна новая функция Visual Basic 2005 — это конструктор ресурсов, который позволяет добавлять ресурсы в приложение. Конструктор ресурсов также создает модуль, который можно использовать для строго типизированного доступа к ресурсам вашего приложения. Например, если вы добавите в проект растровое изображение с именем Smiley, вы сможете получить к нему доступ с помощью My.Resources.Smiley. Вы можете просмотреть пример созданного модуля ресурсов, отобразив Все файлы в обозревателе решений примера проекта и найдя файл MyResources.vb в узле MyResources.resx.
Ниже приведен пример примера проекта, созданного для возврата свойства фабрики для ресурса Smiley:
PublicReadOnlyPropertySmiley()AsSystem.Drawing.Bitmap
Получать
ReturnCType(ResourceManager.GetObject(Smiley,_resCulture),_
Система.Рисование.Растровое изображение)
КонецGet
Конепроперти
Созданный строго типизированный модуль ресурсов обрабатывает идентификаторы ресурсов с учетом регистра, использует класс System.Resources.ResourceManager для получения ресурсов и управляет деталями, связанными с правильным созданием ResourceManager для вашего приложения.
Чтобы получить доступ к одному и тому же растровому изображению смайлика в VisualBasic2002 или VisualBasic2003, сначала необходимо поместить растровое изображение в файл .resx, что сложно. Другой способ — поместить его в проект как встроенный ресурс, и вам нужно не забыть изменить действие сборки в сетке свойств ресурса, который будет внедренным ресурсом. Таким образом, код, который вы пишете, должен выглядеть так:
DimCurrentAssemblyAsReflection.Assembly=_
Reflection.Assembly.GetExecutingAssembly
DimBitMapStreamAsIO.Stream=_
CurrentAssembly.GetManifestResourceStream(_
WindowsApplication2.Smiley.bmp)
DimSmileyBitmapasDrawing.Bitmap=NewBitmap(BitMapStream)
В этом коде есть некоторые важные детали, которые вам необходимо знать. Вам нужно знать, чтобы получить текущую исполняемую сборку и вызвать для нее GetManifestResourceStream(). Вы должны помнить, что имена ресурсов следует уточнять именем корневого пространства имен. Вам необходимо получить разрешение на регистр, поскольку имя, передаваемое в GetManifestResourceStream(), чувствительно к регистру. Вы должны знать, где определить класс потока, чтобы можно было зафиксировать возвращаемое значение GetManifestResource в объекте потока. Вы должны знать, как создать растровое изображение из потока. Вы можете столкнуться с разочарованием при попытке определить, почему BitMapStream всегда возвращает Nothing из-за одной из вышеперечисленных проблем.
Visual Basic 2005 решает первую проблему, предоставляя ResourceEditor, который позволяет легко размещать новые или существующие ресурсы в файлах .resx. Затем к этим ресурсам можно будет легко получить доступ с помощью My. Все, что вам нужно сделать, это написать следующее:
DimSmileyBitmapasDrawing.Bitmap=My.Resources.Smiley
Резьба
Экземпляры классов, доступные в My, предоставляются таким образом, чтобы избежать проблем с потоками, поскольку экземпляры объектов My предоставляются отдельно для каждого потока. То есть экземпляр My.Computer, возвращенный в потоке 1, отличается от экземпляра My.Computer, возвращенного в потоке 2. Это означает, что вам не нужно писать код синхронизации при использовании объекта «Мой».
В веб-приложении экземпляр, возвращенный из My, сохраняется по запросу.
краткое содержание
Мы рассмотрели, как My предоставляет классы .NET Framework и как можно создавать динамически создаваемые классы в дополнение к My.
Наконец, My сокращает количество строк кода, которые необходимо написать, и обеспечивает доступ к часто используемым функциям. Это делается эффективным, надежным и потокобезопасным способом. В среде, где эффективность работы программиста особенно важна, My может помочь вам выполнить работу быстрее и эффективнее.
->