|
Программирование >> C# visual basicc#
освободить ресурсы класса GC.SuppressFinalize(this); public void Dispose() Dispose(true); C++/CLI public ref class Resource public: ~Resource() реализует IDisposable this->!Resource(); !Resource() переопределение Finalize освободить ресурсы Visual Basic Public Class Resource Implements IDisposable Public Sub Dispose() Implements IDisposable.Dispose Dispose(True) GC.SuppressFinalize(Me) End Sub Protected Overridable Sub Dispose(ByVal disposing) If disposing Then освободить вложенные ресурсы End If освободить ресурсы данного класса End Sub Protected Overrides Sub Finalize() Dispose(False) Finally MyBase.Finalize() End Try End Sub End Class Делегаты Делегаты - безопасные в отношении типов указатели на методы - обсуждались в главе 7. Во всех трех языках для определения делегата может быть использовано ключевое слово delegate. Отличие заключается в использовании делегатов. Код примера показывает класс Demo со статическим методом Foo() и методом экземпляра Bar() . Оба эти метода вызываются экземплярами делегатов типа DemoDelegate. Тип DemoDelegate объявлен как вызывающий метод с типом возврата void и одним параметром int. В C# 2.0 поддерживаются предположения делегатов, когда компилятор создает экземпляр делегата и передает адрес метода. В C# и C++/CLI два делегата могут быть комбинированы в один с помощью операции +. C# public delegate void DemoDelegate(int x); public class Demo public static void Foo(int x) { } public void Bar(int x) { } Demo d = new Demo(); DemoDelegate d1 = Demo.Foo; DemoDelegate d2 = d.Bar; DemoDelegate d3 = d1 + d2; d3(11); Предположения делегатов невозможны в C++/CLI. В C++/CLI необходимо создать новый экземпляр типа делегата и передать адрес метода конструктору. C++/CLI public delegate void DemoDelegate(int x); public ref class Demo public: static void Foo(int x) { } void Bar(int x) { } Demo d = gcnew Demo(); DemoDelegate d1 = gcnew DemoDelegate(&Demo::Foo); DemoDelegate d2 = gcnew DemoDelegate(d, &Demo::Bar); DemoDelegate d3 = d1 + d2; d3(11); Подобно C++/CLI, Visual Basic не поддерживает предположения делегатов. Вы должны создать новый экземпляр типа делегата и передать адрес методу. Visual Basic имеет оператор AddressOf для передачи адреса методу. Visual Basic не перегружает операцию + для делегатов, поэтому вместо этого необходимо вызывать метод Combine() из класса Delegate. Класс Delegate пишется внутри квадратных скобок, поскольку Delegate - ключевое слово в Visual Basic, а потому невозможно использовать класс с таким же именем. Помещение Delegate в квадратные скобки гарантирует, что будет использован класс Delegate вместо ключевого слова Delegate. Visual Basic Public Delegate Sub DemoDelegate(ByVal x As Integer) Public Class Demo Public Shared Sub Foo(ByVal x As Integer) End Sub Public Sub Bar(ByVal x As Integer) End Sub End Class Dim d As New Demo() Dim d1 As New DemoDelegate(AddressOf Demo.Foo) Dim d2 As New DemoDelegate(AddressOf d.Bar) Dim d3 As DemoDelegate = [Delegate].Combine(d1, d2) d3(11) События С ключевым словом event может быть реализован механизм подписки на основе делегатов. Во всех языках предусмотрено ключевое слово event для предоставления событий из класса. Класс EventDemo возбуждает событие по имени DemoEvent типа DemoDelegate. В C# синтаксис для инициации события выглядит как вызов метола события. Переменная события остается равной null до тех пор, пока никто не зарегистрирует событие, поэтому следует выполнять проверку на неравенство null, прежде чем возбуждать событие. Метод-обработчик регистрируется операцией +=, и адрес этого метода передается с помощью механизма предположения делегата. C# public class EventDemo public event DemoDelegate DemoEvent; public void FireEvent() if (DemoEvent != null) DemoEvent(44); public class Subscriber public void Handler(int x) handler implementation ... EventDemo evd = new EventDemo(); Subscriber subscr = new Subscriber(); evd.DemoEvent += subscr.Handler; evd.FireEvent(); C++/CLI очень похож на C#, за исключением того, что возбуждение события не требует предварительной проверки переменной события на неравенство null. Это делается автоматически в коде IL, созданном компилятором. И в C#, и в C++/CLI используется операция -= для отмены регистрации события. C++/CLI public ref class EventDemo public: event DemoDelegate DemoEvent; public void FireEvent() DemoEvent(44); public class Subscriber public: void Handler(int x) реализация обработчика ... EventDemo evd = gcnew EventDemo(); Subscriber subscr = gcnew Subscriber(); evd->DemoEvent += gcnew DemoDelegate(subscr, &Subscriber::Handler); evd->FireEvent();
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |