Симон Робинсон - 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++. Возьмем следующее объявление двух переменных в C++:
int j = 30;
CMyClass *pMine = new CMyClass;
Здесь содержимое j
хранится в стеке. Это в точности та ситуация, которая существует с типами данных значений C#. Экземпляр MyClass
хранится, однако, в куче, а указатель на него находится в стеке, что по сути повторяет ситуацию со ссылочными типами в C#, за исключением того, что в C# синтаксис скрывает указатель под личиной ссылки. Эквивалент в C# будет следующим:
int J = 30;
MyClass Mine = new MyClass();
Этот код имеет в большой степени тот же результат, в соответствующих терминах как и приведенный выше код C++: различие состоит в том, что MyClass синтаксически используется как ссылка, а не как указатель.
Однако C++ и C# разнятся еще и тем, что C# не позволяет выбирать, как выделить память для определенного экземпляра. Например, в C++ можно сделать следующее действие:
int* рj = new int(30);
CMyClass Mine;
Это приведет к тому, что int
будет находиться в куче, а экземпляр CMyClass
— в стеке. Этого нельзя сделать в C#, так как C# считает, что int
является типом значения, в то время как любой класс всегда будет ссылочным типом.
Другое различие состоит в том, что в C# не существует эквивалента оператора C++ delete
. Вместо этого в C# сборщик мусора платформы .NET периодически вызывается и сканирует ссылки в коде, чтобы идентифицировать, какие области кучи в настоящее время используются программой. Затем он автоматически может удалить все объекты, которые больше не используются. Эта техника эффективно помогает избавиться от необходимости самостоятельно освобождать память в куче.
В C# следующие типы данных всегда являются типами значений:
□ Все простые предопределенные типы (за исключением object
и string
)
□ Все структуры
□ Все перечисления
Следующие типы данных всегда являются ссылочными типами:
□ object
□ string
□ Все классы
Оператор new
Оператор new
имеет совершенно другое значение в C#, чем в C++. В C++ new
указывает на запрос памяти из кучи. В C# new
означает просто, что вызывается конструктор переменной. Однако действие аналогично в той степени, что если переменная имеет ссылочный тип то вызов ее конструктора будет неявно означать, что память выделяется в куче. Например, предположим, что имеется класс MyClass
и структура MyStruct
. В соответствии с правилами C# экземпляры MyClass
всегда будут храниться в куче, а экземпляры MyStruct
в стеке.
MyClass Mine; // Просто объявляем ссылку. Аналогично объявлению
// неинициализированного указателя в C++
Mine = new MyClass(); // создает экземпляр MyClass. Вызывает
// конструктор без параметров, в процессе этого
// выделяет память в куче
MyStruct Struct; // создает экземпляр MyStruct, но не вызывает
// никакого конструкторе. Поля в MyStruct
// будут неинициализированы
Struct = new MyStruct(); // вызывает конструктор, поэтому
// инициализирует поля, но не выделяет
// никакой памяти, так как Struct уже
// существует в стеке
Можно использовать new
для того, чтобы вызвать конструктор для предопределенных типов данных:
int X = new int();
Это имеет такой же результат, как:
int X = 0;
Отметим, что это то же самое, что и
int X;
Последняя инструкция оставит X
неинициализированной (если переменная X
является локальной переменной метода).
Методы
Методы в C# определяются таким же образом, как функции в C++, с учетом факта, что методы C# всегда должны быть членами класса, и определение и объявление в C# всегда объединены:
class MyClass {
public int MyMethod() {
// реализация
Есть одно ограничение, состоящее в том, что методы-члены не могут объявляться как const
в C#. Свойство C++ явно объявлять методы как const
(другими словами, не изменяющими содержащий их экземпляр класса) выглядело первоначально как хорошее средство проверки на наличие ошибок во время компиляции, но оказалось вызывающим проблемы на практике. Это было связано с тем, что методы, чтобы сохранять открытое состояние класса, изменяют значения закрытых переменных членов, например, переменных, которые задаются при первом обращении. В коде C++ вполне можно встретить оператор const_cast
, используемый для того, чтобы обойти метод, объявленный как const
. В связи с этими проблемами компания Microsoft решила не использовать константные методы в C#.
Параметры методов
Как и в C++, по умолчанию параметры передаются в методы по значению. Если требуется это изменить, можно использовать ключевое слово ref
, указывающее, что параметр передается по ссылке, и out
, чтобы указать, что это параметр вывода (всегда передается по ссылке). Если это сделано, то необходимо объявлять этот факт как в определении метода, так и при его вызове.
public void MultiplyByTwo(ref double d, out double square) {
d *= 2;
square = d*d;
}
// позже, при вызове метода
double Value, Square Value = 4.0;
MultiplyByTwo(ref Value, out Square);
Передача по ссылке означает, что метод может изменять значение параметра. Передача по ссылке также осуществляется, чтобы улучшить производительность при работе с большими структурами, также как и в C++, передача по ссылке означает, что копируется только адрес. Отметим, однако, что, если при передаче по ссылке из соображений производительности вызываемый метод по-прежнему не изменяет значения параметра, то C# не разрешает присоединять модификатор const
к параметрам, как это делает C++.
Параметры типа out
действуют по большей части так же, как ссылочные параметры. Но они предназначены для случаев, когда вызываемый метод задает значение для параметра, а не изменяет его. Следовательно, инициализации параметров будут отличаться. C# требует, чтобы параметр ref
инициализировался внутри вызываемого метода до своего использования.
Перезагрузка методов
Методы могут быть перезагружены таким же образом, как в C++. Однако C# не допускает в методах параметров по умолчанию. Это можно смоделировать с помощью перезагружаемой версии:
Для C++ можно сделать следующую запись:
double DoSomething(int someData, bool Condition=true) {
// и т.д.
В то время как в C# необходимо выполнить такие действия:
double DoSomething(int someData) {
DoSomething(someData, true);
}
double DoSomething(int someData, bool condition) {
// и т.д.
Свойства
Свойства не имеют эквивалента в ANSI C++, хотя они были введены как расширение в Microsoft Visual C++. Свойство является методом или парой методов, которые синтаксически оформлены для представления в вызывающем коде, как будто свойство является полем. Они существуют для ситуации, когда интуитивно удобнее вызывать метод с помощью синтаксиса поля, очевидным примером будет случай закрытого поля, которое должно быта инкапсулировано с помощью оболочки из открытых методов доступа. Предположим, что класс имеет такое поле length
типа int
. Тогда в C++ оно инкапсулируется с помощью методов GetLength()
и SetLength()
. Необходимо будет обращаться к нему извне класса:
Интервал:
Закладка: