Симон Робинсон - C# для профессионалов. Том II
- Название:C# для профессионалов. Том II
- Автор:
- Жанр:
- Издательство:Лори
- Год:2003
- Город:Москва
- ISBN:5-85582-187-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Симон Робинсон - C# для профессионалов. Том II краткое содержание
Платформа .NET предлагает новую среду, в которой можно разрабатывать практически любое приложение, действующее под управлением Windows, а язык C# — новый язык программирования, созданный специально для работы с .NET.
В этой книге представлены все основные концепции языка C# и платформы .NET. Полностью описывается синтаксис C#, приводятся примеры построения различных типов приложений с использованием C# — создание приложений и служб Windows, приложений и служб WWW при помощи ASP.NET, а также элементов управления Windows и WWW Рассматриваются общие библиотеки классов .NET, в частности, доступ к данным с помощью ADO.NET и доступ к службе Active Directory с применением классов DirectoryServices.
Для кого предназначена эта книгаЭта книга предназначена для опытных разработчиков, возможно, имеющих опыт программирования на VB, C++ или Java, но не использовавших ранее в своей работе язык C# и платформу .NET. Программистам, применяющим современные технологии, книга даст полное представление о том, как писать программы на C# для платформы .NET.
Основные темы книги• Все особенности языка C#
• C# и объектно-ориентированное программирование
• Приложения и службы Windows
• Создание web-страниц и web-служб с помощью ASP NET
• Сборки .NET
• Доступ к данным при помощи ADO NET
• Создание распределённых приложений с помощью NET Remoting
• Интеграция с COM, COM+ и службой Active Directory
C# для профессионалов. Том II - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
class MyClass {
private MyClass() {
}
Это также не позволяет создавать экземпляры любых производных классов. Однако, если класс или методы в нем объявлены абстрактными, то нельзя создать экземпляр этого класса, причем не обязательно производного класса.
Списки инициализации конструктора
Конструкторы C# могут иметь элементы, которые выглядят как списки инициализации конструктора C++. Однако в C# такой список содержит только максимум один член и называется инициализатором конструктора. Элемент в инициализаторе должен быть либо конструктором непосредственного базового класса, либо другим конструктором того же класса. Синтаксис этих двух вариантов использует ключевые слова base
и this
соответственно:
class MyClass : MyBaseClass {
MyClass(int X)
: base(X) // выполняет конструктор MyBaseClass с одним параметром
{
// здесь другая инициализация
}
MyClass()
: this(10) // выполняет конструктор MyClass с одним параметром,
// передавая в него значение 10
{
// здесь другая инициализация
}
Если явно не задан никакой список инициализации конструктора, то компилятор будет неявно использовать список из элемента base()
. Другими словами, инициализатор по умолчанию вызывает конструктор по умолчанию базового класса. Это поведение совпадает с C++.
В отличие от C++ нельзя поместить переменные члены в список инициализации конструктора. Однако это только вопрос синтаксиса, так как эквивалент C# должен отметить свои начальные значения в определении класса.
Более серьезным различием является тот факт, что можно поместить только один иной конструктор в список. Это влияет на способ разработки конструкторов, хотя несомненно полезно, так как заставляет использовать хорошо определенную и эффективную парадигму организации конструкторов. Эта парадигма указана в приведенном выше коде. Все конструкторы следуют единому порядку, в котором выполняются различные конструкторы.
Деструкторы
C# реализует отличную от C++ модель программирования деструкторов. Это связано с тем, что механизм сборки мусора в C# предполагает следующее:
□ Существует меньшая необходимость в деструкторах, так как динамически распределенная память будет удаляться автоматически.
□ Так как невозможно предсказать, когда сборщик мусора реально разрушит заданный объект, то если для класса предоставляется деструктор, невозможно предсказать в точности, когда этот деструктор будет выполнен.
Поскольку память очищается в C# "за сценой", то оказывается, что только небольшое число классов действительно нуждается в деструкторах. Для тех, кому это нужно (это классы, которые поддерживают внешние неуправляемые ресурсы, такие как соединения с файлами или с базами данных), C# имеет двухэтапный механизм разрушения:
1. Класс должен выводиться из интерфейса IDisposable
и реализовывать метод Dispose()
. Этот метод предназначен для явного вызова с помощью кода клиента для указания, что он закончил работать с объектом и требуется очистить ресурсы. (Интерфейсы будет рассмотрены позже в этом приложении.)
2. Класс должен отдельно реализовать деструктор, который рассматривается как запасной механизм, на случай, если клиент не вызывает Dispose()
.
Обычная реализация Dispose()
выглядит следующим образом:
public void Dispose() {
// очистка ресурсов
System.GC.SuppressFinalize(this);
}
System.GC
является базовым классом, представляющим сборщика мусора. SuppressFinalize()
является методом, который информирует сборщика мусора, что нет необходимости вызывать деструктор для разрушаемого объекта. Вызов SuppressFinalize()
важен, так как имеется снижение производительности, если в объекте есть деструктор, который нужно вызывать в то время, когда сборщик мусора выполняет свою работу. Следствием этого является то, что реальное освобождение управляемой памяти, занимаемой этим объектом, будет существенно задерживаться.
Синтаксис деструктора по сути такой же в C#, как и в C++. Отметим, что в C# не требуется объявлять деструктор виртуальным, компилятор будет это подразумевать. Не требуется также предоставлять модификатор доступа:
Class MyClass {
~MyClass() {
// очистка ресурсов
}
}
Хотя метод Dispose()
обычно явно вызывается клиентами, C# допускает альтернативный синтаксис, который гарантирует, что компилятор примет меры, чтобы он был вызван. Если переменная объявлена внутри блока using()
, то ее область действия совпадает с блоком using
и ее метод Dispose()
будет вызываться при выходе из блока:
using (MyClass MyObject = new MyClass()) {
// код
} // MyObject.Dispose() будет неявно вызван при выходе из этого блока
Отметим, что приведенный выше код будет компилироваться успешно только если MyClass
выводится из интерфейса IDisposable
и реализует метод Dispose()
. Если нежелательно использовать синтаксис using
, то можно опустить один или оба из двух шагов в последовательности деструктора (реализация Dispose()
и реализация деструктора), но обычно реализуются оба шага. Можно также реализовать Dispose()
, без привлечения интерфейса IDisposable
, но если это делается, то снова невозможно использовать синтаксис using
, чтобы для экземпляров этого класса Dispose()
вызывался автоматически.
Наследование
Наследование работает в основном таким же образом в C#, как и в C++, с тем исключением, что множественная реализация наследования не поддерживается. Компания Microsoft считает, что множественное наследование ведет к коду, который хуже структурирован и который труднее сопровождать, и поэтому решила исключить это свойство из C#.
Class MyClass : MyBaseClass {
// и т.д.
В C++ указатель на класс может дополнительно указывать на экземпляр производного класса. (Виртуальные функции в конце концов зависят от этого факта.) В C# классы доступны через ссылки, но правило остается тем же. Ссылка на класс может ссылаться на экземпляры этого класса или на экземпляры любого производного класса.
MyBaseClass Mine;
Mine = new MyClass(); // все нормально, если MyClass будет производным
// от MyBaseClass
Если желательно, чтобы ссылка ссылалась на произвольный объект (эквивалент void*
в C++), можно определить ее как object
в C#, так как C# отображает object
в класс System.Object
, из которого выводятся все другие классы.
object Mine2 = new MyClass();
Виртуальные и невиртуальные функции
Виртуальные функции поддерживаются в C# таким же образом, как и в C++. Однако в C# существуют некоторые синтаксические отличия, которые созданы, чтобы исключить возможную неоднозначность в C++. Это означает, что некоторые типы ошибок, которые появляются в C++ только во время выполнения, будут идентифицированы в C# во время компиляции.
Читать дальшеИнтервал:
Закладка: