|
Программирование >> C# visual basicc#
Окончание табл. Б.4
Порядок размещения ключевых слов в разных языках имеет значение. В следующем примере кода объявляется абстрактный базовый класс Base с одним абстрактным методом и одним реализованным виртуальным методом. От класса Base наследуется класс Derived, в котором абстрактный метод реализуется, а виртуальный метод переопределяется. C# public abstract class Base public virtual void Foo() public abstract void Bar(); public class Derived : Base public override void Foo() base.Foo(); public override void Bar() C++/CLI public ref class Base abstract public: virtual void Foo() virtual void Bar() abstract; public ref class Derived : public Base public: virtual void Foo() override Base::Foo(); virtual void Bar() override Visual Basic Public MustInherit Class Base Public Overridable Sub Foo() End Sub Public MustOverride Sub Bar() End Class Public class Derived Inherits Base Public Overrides Sub Foo() MyBase.Foo() End Sub Public Overrides Sub Bar() End Sub End Class Управление ресурсами Работа с ресурсами была описана в главе 12, как посредством интерфейса IDisposable, так и реализацией финализатора. В этом разделе мы покажем, как это выглядит в C++/CLI и Visual Basic. Реализация интерфейса iDisposable Для освобождения ресурсов в интерфейсе IDisposable определен метод Dispose(). Используя C# и Visual Basic, вы должны реализовать интерфейс IDisposable. В C++/ CLI этот интерфейс также реализован, но это осуществляется компилятором, если вы написали деструктор. C# public class Resource : IDisposable public void Dispose() освобождение ресурсов C++/CLI public ref class Resource public: ~Resource() освобождение ресурсов Visual Basic Public Class Resource Implements IDisposable Public Sub Dispose() Implements IDisposable.Dispose освобождение ресурсов End Sub End Class В C++/CLIметод Dispose() вызывается при использовании оператора delete. Оператор using Оператор C# using реализует шаблон захватить/использовать/освободить для освобождения ресурса, как только он более не используется - даже в случае возникновения исключения. Компилятор создает оператор try/finally и вызывает метод Dispose внутри блока finally. Версия Visual Basic 9 поддерживает оператор using подобно C#. В C++/CLI предусмотрен еще более элегантный подход к этой проблеме. Если ссылочный тип объявлен локально, то компилятор создает оператор try/finally для вызова метода Dispose() в конце блока. C# using (Resource r = new Resource()) r.Foo(); C++/CLI Resource r; r.Foo(); Visual Basic Using r As New Resource r.Foo() End Using Переопределение Finalize Если класс содержит родные ресурсы, которые должны быть освобождены, он должен переопределить метод Finalize() класса Object. В C# это делается путем написания деструктора. В C++/CLI предусмотрен специальный синтаксис с префиксом ! для определения финализатора. Внутри финализатора не допускается освобождать содержащиеся объекты, также имеющие финализатор, поскольку четкий порядок фи-нализации не гарантирован. Вот почему шаблон Dispose определяет вдобавок метод Dispose() с параметром булевского типа. В C++/CLI нет необходимости реализовы-вать этот шаблон в коде, поскольку это делается компилятором. Деструктор C++/CLI реализует методы Dispose() . В Visual Basic и метод Dispose() , и финализатор должны быть реализованы вручную. Однако большинство классов Visual Basic не используют родные ресурсы непосредственно, а только с помощью других классов. В Visual Basic обычно нет необходимости переопределять метод Finalize(), но реализация метода Dispose() часто необходима. Написание деструктора на C# переопределяет метод Finalize() базового класса. Деструктор C++/CLI реализует интерфейс IDisposable. C# public class Resource : IDisposable -Resource переопределение Finalize Dispose(false); protected virtual void Dispose(bool disposing) if (disposing) освободить вложенные члены
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |