Программирование >>  C# visual basicc# 

1 ... 5 6 7 [ 8 ] 9 10


освободить ресурсы класса 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();



1 ... 5 6 7 [ 8 ] 9 10

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика