|
Программирование >> C# visual basicc#
Visual Basic поддерживает другой синтаксис. Событие объявляется ключевым словом Event - точно так же, как и в C# и C++/CLI. Однако событие возбуждается оператором RaiseEvent. Оператор RaiseEvent проверяет, инициализирована ли подписчиком переменная события. Для регистрации обработчика служит оператор AddHandler, имеющий ту же функциональность, что и операция += в C#. AddHandler требует двух параметров: первый определяет событие, а второй - адрес обработчика. Оператор RemoveHandler используется для отмены регистрации обработчика события. Visual Basic Public Class EventDemo Public Event DemoEvent As DemoDelegate public Sub FireEvent() RaiseEvent DemoEvent(44); End Sub End Class Public Class Subscriber Public Sub Handler(ByVal x As Integer) handler implementation End Sub End Class Dim evd As New EventDemo() Dim subscr As New Subscriber() AddHandler evd.DemoEvent, AddressOf subscr.Handler evd.FireEvent() Visual Basic предлагает другой синтаксис, который отсутствует в других языках: вы можете также использовать ключевое слово Handles с методом, подписанным на событие. Необходимым условием для этого является определение переменной с ключевым словом WithEvents: Public Class Subscriber Public WithEvents evd As EventDemo Public Sub Handler(ByVal x As Integer) Handles evd.DemoEvent Реализация обработчика End Sub Public Sub Action() evd = New EventDemo() evd.FireEvent() End Sub End Class Обобщения Все три языка поддерживают создание и использование обобщений. Обобщения обсуждались в главе 9. Для использования обобщений C# позаимствовал синтаксис из шаблонов C++ для определения обобщенных типов с угловыми скобками. C++/CLI использует тот же синтаксис. В Visual Basic обобщенный тип определен с ключевым словом Of в скобках. C# List<int> intList = new List<int>(); intList.Add(1) intList.Add(2) intList.Add(3) C++/CLI List<int> intList = gcnew List<int>(); intList->Add(1) intList->Add(2) intList->Add(3) Visual Basic Dim intList As List(Of Integer) = New List(Of Integer)() intList.Add(1) intList.Add(2) intList.Add(3) Поскольку вы используете угловые скобки в объявлении класса, компилятор знает, что он должен создать обобщенный тип. В конструкции where определены ограничения (constraints). public class MyGeneric<T> where T : IComparable<T> private List<T> list = new List<T>(); public void Add(T item) list.Add(item); public void Sort() list.Sort(); Определение обобщенного типа в C++/CLI подобно определению шаблона в C++. Вместо ключевого слова template с обобщениями используется ключевое слово generic. Конструкция where похожа на такую же в C#; однако в C++/CLI не поддерживаются ограничения конструктора. generic <typename T> where T : IComparable<T> ref class MyGeneric private: List<T> list; public: MyGeneric() list = gcnew List<T>(); void Add(T item) list->Add(item); void Sort() list->Sort(); В Visual Basic обобщенный класс определяется с помощью ключевого слова Of. Ограничения могут быть определены с помощью ключевого слова As. Public Class MyGeneric(Of T As IComparable(Of T)) Private myList = New List(Of T) Public Sub Add(ByVal item As T) myList.Add(item) End Sub Public Sub Sort() myList.Sort() End Sub End Class Запросы LINQ Интегрированные в язык запросы - средство C# 3.0 и Visual Basic 9.0. Синтаксис, используемый в двух языках, очень похож. LINQ обсуждается в главе 11. C# var query = from r in racers where r.Country == Brazil orderby r.Wins descending select r; Visual Basic Dim query = From r in racers Where r.Country = Brazil Order By r.Wins Descending Select r C++/CLI не поддерживает запросов LINQ. Смешивание родного и управляемого кода в C++/CLI Одним из наибольших преимуществ C++/CLI является возможность смешивания родного и управляемого кода. Использование родного кода из C# осуществляется через механизм, известный, как врезов платформы (platform invoke). Этот механизм обсуждается в главе 24. Использование родного кода из C++/CLI известно под термином It just works ( Это просто работает ). В управляемом классе вы можете использовать как родной, так и управляемый код, как видно в приведенном ниже фрагменте. То же справедливо и для родного класса. Вы также можете смешивать родной и управляемый код внутри метода. #pragma once #include <iostream> включаем этот файл для cout using namespace std; заголовок iostream определен в пространстве имен std using namespace System; public ref class Managed public: void MixNativeAndManaged() cout << Родной код << endl; Console::WriteLine( УправляемIЙ код ); В управляемом классе вы также можете объявить поле родного типа или указатель на родной тип. Сделать то же самое другим способом напрямую невозможно. Вы должны позаботиться о том, чтобы экземпляр управляемого типа мог быть перемещен сборщиком мусора при очистке памяти. Для использования управляемых классов как членов родных классов в C++/CLI определено ключевое слово gcroot, которое находится в заголовочном файле gcroot.h. gcroot является оболочкой для GCHandle, который отслеживает объект CLR из родной ссылки.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |