Симон Робинсон - 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++:
int CMyClass::MyConstant = 2;
class CMyClass {
public:
static const int MyConstant;
Синтаксис C#:
class MyClass {
public const int MyConstant = 2;
Отметим, что в C# константа не определяется явно как static
, если это сделать, то возникнет ошибка компиляции. Она является, конечно, неявно статической, так как не существует возможности задать значение константы более одного раза, и, следовательно, она всегда должна быть доступна как статическое поле.
int SomeVariable = MyClass.MyConstant;
Ситуация становится интереснее, если статическую константу инициализировать некоторым значением, которое вычисляется во время выполнения. C++ не имеет средств, чтобы это сделать. Для достижения такого результата потребуется найти некоторые возможности инициализировать переменную при первом обращении к ней, что означает, что ее прежде всего невозможно объявить как const
. В случае C# статические константы инициализируются во время выполнения. Поле определяется как readonly
и инициализируется в статическом конструкторе.
class MyClass {
public static readonly int MyConstant;
static MyClass() {
// определяет и присваивает начальное значение MyConstant
}
Константы экземпляра
Константы, которые ассоциированы с экземплярами класса, всегда инициализируются значениями, вычисленными во время выполнения. (Если их значения были вычислены во время компиляции, то, по определению, это делает их статическими.)
В C++ такие константы должны быть инициализированы в списке инициализации конструктора класса. Это в некоторой степени ограничивает гибкость при вычислении значений этих констант, так как начальное значение должно быть таким, чтобы его можно было записать как выражение в списке инициализации конструктора.
class CMyClass {
public:
const int MyConstInst;
CMyClass() : MyConstInst(45); {
В C# принцип похож, но константа объявляется как readonly
, а не как const
. Таким образом, ее значение задается в теле конструктора, придавая гибкость процессу, так как можно использовать любые инструкции C# при вычислении начального значения. (Вспомните, что в C# невозможно задать значения переменных в инициализаторе конструктора, только вызвать другой конструктор.)
class MyClass {
public readonly int MyConstInst;
MyClass() {
// определяет и инициализирует здесь MyConstInst
Если поле в C# объявлено как readonly
, то ему можно присвоить значение только в конструкторе.
Перезагрузка операторов
Перезагрузка операторов происходит в C# и в C++ аналогично, но существуют небольшие различия. Например, C++ допускает перезагрузку большинства своих операторов. C# имеет больше ограничений. Для многих составных операторов C# автоматически определяет значение оператора из значений составляющих операторов, т.е. там, где C++ допускает прямую перезагрузку. Например, в C++ перезагружается +
и отдельно +=
. В C# можно перезагрузить только +
. Компилятор всегда будет использовать перезагруженную версию +
, чтобы автоматически определить значение +=
для этого класса или структуры.
Следующие операторы могут перезагружаться в C# также, так и в C++:
□ Бинарные арифметические операторы +
, -
, *
, /
, %
□ Унарные операторы ++
и --
(только префиксная форма)
□ Операторы сравнения !=
, ==
, <
, <=
, >=
□ Побитовые операторы &
, |
, ~
, ^
, !
□ Булевы значения true
и false
Следующие операторы, перезагружаемые в C++, нельзя перезагружать в C#.
□ Арифметические операторы присваивания *=
, /=
, +=
, -=
, %=
. (Они определяются компилятором из соответствующих арифметических операторов и оператора присваивания, который не может перезагружаться.) Постфиксные операторы увеличения на единицу. Они определяются компилятором из перезагруженных версий соответствующих префиксных операторов. (Реализуются с помощью вызова соответствующей перезагруженной версии префиксного оператора, но возвращают первоначальное значение операнда вместо нового значения.)
□ Операторы побитового присваивания &=
, |
=, ^=
, >>=
и <<=
.
□ Булевы операторы &&
, ||
. (Они определяются компилятором из соответствующих побитовых операторов.)
□ Оператор присваивания =
. Значение этого оператора в C# фиксировано.
Существует также ограничение в том, что операторы сравнения должны перезагружаться парами, другими словами, при перезагрузке ==
необходимо перезагрузить также !=
и наоборот. Аналогично, если перезагружается один из операторов <
и <=
, то необходимо перезагрузить оба оператора и так же для >
и >=
. Причина этого состоит в необходимости обеспечения согласованной поддержки для любых типов данных базы данных, которые могут иметь значение null
и для которых поэтому, например, ==
не обязательно имеет результат, противоположный !=
.
После определения того, что оператор, который требуется перезагрузить, является таким, который можно перезагрузить в C#, синтаксис для реального определения перезагруженной версии значительно проще, чем соответствующий синтаксис в C++. Единственный момент, о котором необходимо помнить при перегрузке операторов C#, состоит в том, что они всегда должны объявляться как статические члены класса. Это противоположно ситуации в C++, где можно определить свои операторы либо как статические члены класса, как член экземпляра класса (но беря на один параметр меньше), либо как функцию, которая не является членом класса вообще.
Причина того, что определение перезагруженных версий операторов настолько проще в C#, не имеет на самом деле ничего общего с самими перезагруженными версиями операторов. Это связано со способом, которым осуществляется управление памятью в C#. Определение перезагруженных версий операторов в C++ является областью, которая заполнена ловушками, Рассмотрим, например, попытку перезагрузить оператор сложения для класса в C++. (Предполагается для этого, что
CMyClass имеет член x
и сложение экземпляров означает сложение членов x
.). Код может выглядеть следующим образом (предполагается, что перезагруженная версия является явной вставкой кода):
static CMyClass operator+(const CMyClass &lhs, const CMyClass &rhs) {
CMyClass Result;
Result.x = lhs.x + rhs.x;
return Result;
}
Отметим, что оба параметра объявлены как const
и передаются по ссылке, чтобы обеспечить оптимальную производительность. Это само по себе не слишком плохо. Однако теперь для возвращения результата, необходимо создать временный экземпляр CMyClass
внутри перезагруженной версии оператора. Конечная инструкция return Result
выглядит безопасной, но она будет компилироваться только в том случае, если доступен оператор присваивания для копирования Result
из функции.
Интервал:
Закладка: