Симон Робинсон - 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 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
// этот код будет компилироваться в C++ или C#
// и имеет одинаковый результат в обоих языках
int X = 10, Y = 20;
int *рХ = &Х;
*рХ = 30;
pХ = &Y;
++рХ; // добавляет sizeof(int) к рХ
Отметим, однако, следующие моменты.
□ В C# не допускается разыменовывать указатели void*
, также нельзя выполнять арифметические операции над указателями void*
. Синтаксис указателя void*
был сохранен для обратной совместимости, для вызова внешних функций API, которые не знают о .NET и которые требуют указателей void*
в качестве параметров.
□ Указатели не могут указывать на ссылочные типы (классы или массивы). Также они не могут указывать на структуры, которые содержат встроенные ссылочные типы в качестве членов. Это в действительности попытка защитить данные, используемые сборщиком мусора и средой выполнения .NET (хотя в C#, также как и в C++, если начать использовать указатели, почти всегда можно найти способ обойти любые ограничения, выполняя арифметические операции на указателях и затем разыменовывая их).
□ Помимо объявления соответствующих частей кода как ненадежных, необходимо также определять для компилятора флаг /unsafe
при компиляции кода, который содержит указатели.
□ Указатели не могут указывать на переменные, которые встроены в ссылочные типы данных (например, членов класса), если только они не объявлены внутри инструкции fixed
.
Фиксация донных в куче
Разрешается присвоить адрес типа данных значения указателю, даже если этот тип встроен как поле-член в ссылочный тип данных. Однако такой указатель должен быть объявлен внутри инструкции fixed
. Причина этого в том, что ссылочные типы могут в любое время перемещаться в куче сборщиком мусора. Сборщик мусора знает о ссылках C# и может обновить их, как требуется, но он не знает об указателях. Следовательно, если указатель направлен на член класса в куче и сборщик мусора перемещает весь экземпляр класса, то будет указан неправильный адрес. Инструкция fixed
не позволяет сборщику мусора перемещать указанный экземпляр класса во время выполнения блока fixed
, гарантируя целостность значений указателей.
class MyClass {
public int X; // и т.д.
}
// где-то в другом месте кода
MyClass Mine = new MyClass(); // выполнить обработку
fixed (int *pX = Mine.X) {
// можно использовать рХ в этом блоке
}
Возможно вкладывание блоков fixed
для объявления более одного указателя. Можно также объявить более одного указателя в одной инструкции fixed
при условии, что оба указателя имеют один тип объекта ссылки.
fixed (int *рХ = Mine.X, *рХ2 = Mine2.X) {
Объявление массивов в стеке
C# предоставляет оператор stackalloc
, который используется в соединении с указателями для объявления массива в стеке без накладных расходов. Массив, размещаемый таким образом, не является полным объектом System.Array
в стиле C#, он является просто массивом чисел, аналогичным одномерному массиву C++. Элементы этого массива не инициализируются и доступны с помощью такого же синтаксиса, как и в C++, с использованием квадратных скобок для указателя.
Оператор stackalloc
требует спецификации типа данных и числа размещаемых элементов.
Синтаксис C++:
unsigned long рМуArray[20];
Синтаксис C#:
ulong *pMyArray = stackalloc ulong[20];
Отметим, однако, что хотя эти массивы похожи, версия C# позволяет определить размер во время выполнения:
int X;
// инициализировать X
ulong *pMyArray = stackalloc ulong[X];
Интерфейсы
Интерфейсы являются особенностью C#, которая не имеет аналога в ANSI C++, хотя компания Microsoft ввела интерфейсы в C++ с помощью специального ключевого слова. Идея интерфейса развилась из интерфейсов COM, которые предназначены служить контрактом, который указывает, какие методы или свойства реализует объект.
Интерфейс в C# не совсем такой, как интерфейс COM, так как он не имеет связанного с ним GUID, не является производным из IUnknown
и не имеет связанных с ним записей в реестре (хотя можно отобразить интерфейс C# на интерфейс COM). Интерфейс C# является просто множеством определений функций и свойств. Он может рассматриваться как аналог абстрактного класса и определяется с помощью синтаксиса аналогичного класса.
interface IMyInterface {
void MyMethod(int X);
}
Можно заметить, однако, следующие синтаксические различия с определением класса:
□ Методы не имеют модификаторов доступа.
□ Методы никогда не реализуются в интерфейсе.
□ Методы не объявляются виртуальными или явно абстрактными. Выбор методов принадлежит классу, который реализует этот интерфейс.
Класс реализует интерфейс, наследуя из него. Класс может быть производным только от одного класса, но от любого числа интерфейсов. Если класс реализует интерфейс, то он должен предоставить реализации всех методов, определенных этим интерфейсом.
class MyClass : MyBaseClass, IMyInterface, IAnotherInterface // и т.д.
{
public virtual void MyMethod(int X) {
// реализация
}
// и т.д.
В этом примере выбрана реализация MyMethod
как виртуального метода с открытым доступом.
Интерфейсы могут также выводиться из других интерфейсов, и в этом случае производный интерфейс содержит свои собственные методы, а также методы базового интерфейса.
interface IMyInterface : IBaseInterface
Можно проверить, что объект реализует интерфейс, используя либо оператор is
, либо оператор as
для преобразования его в этот интерфейс. Альтернативно можно преобразовать его напрямую, но в этом случае будет получено исключение, если объект не реализует интерфейс, поэтому этот подход годится только в том случае, если известно, что преобразование пройдет успешно. Можно использовать полученную таким образом ссылку на интерфейс, чтобы вызывать методы на этом интерфейсе (реализация будет предоставляться экземпляром класса).
IMyInterface MyInterface;
MyClass Mine = new MyClass();
MyInterface = Mine as IMyInterface;
if (MyInterface != null) MyInterface.MyMethod(10);
Основные применения интерфейсов следующие:
□ Взаимодействовать и устанавливать обратную совместимость с компонентами COM.
□ Служить в качестве контракта для других классов .NET. Интерфейс может использоваться для указания, что класс реализует некоторые свойства. Например, цикл C# foreach работает
внутренне, проверяя, что класс, в котором он используется, реализует интерфейс IEnumerate
, и вызывая затем методы, определенные этим интерфейсом.
Делегаты
Делегаты в C# не имеют прямого эквивалента в C++ и выполняют ту же самую задачу, что и указатели на функции в C++. Идея делегата состоит в том, что указатель на метод помещается в специальный класс вместе со ссылкой на объект, на котором вызывается метод (для метода экземпляра или со ссылкой null
для статического метода). Это означает, что в отличие от указателя на функцию в C++, делегат C# содержит достаточно информации для вызова метода экземпляра.
Интервал:
Закладка: