Симон Робинсон - 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#:
□ Последовательность кодирования \0 распознается в C#. Однако она не используется как терминатор строки в C# и поэтому может встраиваться в строку. Строки C# работают, сохраняя отдельно свои длины, поэтому никакой символ не используется в качестве терминатора. Поэтому строки C# в действительности могут содержать любой символ Unicode.
□ C# имеет дополнительную последовательность кодирования \uxxxx
(или эквивалентно \Uxxxx
), где xxxx
представляет 4-символьное шестнадцатеричное число, \uxxxx
представляет символ Unicode xxxx
, например, \u0065
представляет 'е'
. Однако в отличие от других последовательностей кодирования \uxxxx
может использоваться в именах переменных, а также в символьных и строковых константах. Например, следующий код допустим в C#.
int R\u0065sult; // тот же результат, что и int Result;
Result = 10;
Согласно документации последовательность кодирования не зависит от регистра символов: \uxxxx
и \Uxxxx
будут эквивалентны. Однако при написании этой книги обнаружилось, что только версия нижнего регистра успешно компилируется текущей версией .NET.
C# имеет также альтернативный метод представления строк, который более удобен для строк, содержащих специальные символы: размещение символа @
в начале строки избавляет все символы от кодирования. Эти строки называются дословными строками. Например, чтобы представить строку C:\Book\Chapter2
можно написать либо "C:\\Book\\Chaptеr2"
, либо @"C:\Book\Chapter2"
. Интересно, что это означает также, что можно включать символы возврата каретки в дословные строки без кодирования:
string Message = @"Это будет на первой строке,
а это будет на следующей строке"
Типы значений и ссылочные типы
C# разделяет все типы данных на две разновидности: типы значений и ссылочные типы. Это различие не имеет эквивалента в C++, где переменные всегда неявно содержат значения, если только переменная специально не объявлена как ссылка на другую переменную.
В C# тип значения действительно содержит свое значение. Все предопределенные типы данных в C# являются типами значений, за исключением object
и string
. Если определить свои собственные структуры и перечисления, они также будут типами значений. Это означает, что простые типы данных в C# обычно действуют точно таким же образом как в C++, когда им присваивают значения.
int I = 10;
long J = I; // создаёт копию значения 10
I = 15; //не влияет на J
Ссылочный тип, как предполагает его имя, содержит только ссылку на то место в памяти, где хранятся данные. Синтаксически он действует таким же образом как ссылки в C++, но в терминах того, что происходит реально, ссылки C# ближе к указателям C++. В C# object
и string
являются ссылочными типами, как и любые определенные самостоятельно классы. Ссылки C# могут быть переназначены для указания на другие элементы данных, по большей части таким же образом, как можно переназначить указатели C++. Также ссылкам C# можно присваивать значение null
для указания, что они ни на что не ссылаются. Например, возьмем класс с именем MyClass
, который имеет открытое свойство Width
.
MyClass My1 = new MyClass(); // в C# new просто вызывает конструктор
My1.Width = 20;
MyClass My2 = My1; // My2 указывает теперь на то же место
// в памяти, что и My1
Му2.Width = 30; // Теперь My1.Width = 30, так как My1
// и Му2 указывают на одно место в памяти
My2 = null; // Теперь My2 не ссылается ни на что,
// My1 по прежнему ссылается на тот же объект
В C# невозможно программным путем объявить определенную переменную как тип значения или как ссылочный тип, это определяется исключительно типом данных переменной.
Тип значения и ссылочный тип данных имеют особенности в управлении памятью, так как ссылочные типы всегда хранятся в куче, в то время как типы значений обычно хранятся в стеке. Это рассматривается более подробно в следующем разделе об управлении памятью.
Инициализация переменных
В C++ переменные никогда не инициализируются, если их явно не инициализировать (или в случае классов предоставить конструкторы). Если этого не сделать, переменные будут содержать какие-то случайные данные, оказавшиеся в памяти, это отражает особое внимание в C++ к производительности. C# уделяет больше внимания исключению ошибок во время выполнения и поэтому строже относится к инициализации переменных. В C# существуют следующие правила:
□ Переменные, которые являются полями-членами, по умолчанию инициализируются с помощью нулевых значений, если они не инициализируются явно. Это означает, что числовые типы данных будут содержать нули, bool
будут содержать false
, а все ссылочные типы (включая строки и объекты) будут содержать ссылку null
. Структуры инициализируют нулем каждый свой член.
□ Локальные переменные методов не инициализируются по умолчанию. Однако компилятор будет давать ошибку, если локальная переменная используется до инициализации. Можно при желании инициализировать переменную, вызывая ее конструктор по умолчанию (тот, который обнуляет память).
// локальные переменные метода
int X1; //в этом месте X1 содержит случайные данные
// int Y = X1; // эта закомментированная строка будет создавать ошибку
// компиляции, т.к. X1 используется до инициализации
X1 = new int(); // теперь X1 будет содержать ноль.
Упаковка
В некоторых случаях необходимо использовать тип значения, как если бы он был ссылочным типом. Это можно сделать с помощью процесса, называемого упаковкой (boxing). Синтаксически упаковка означает просто преобразование переменной в объект.
int J = 10;
object BoxedJ = (object)J;
Упаковка действует как любое другое преобразование типов, но надо знать, что содержимое переменной скопируется в кучу и будет создана ссылка (так как объект BoxedJ
является ссылочным типом).
Обычная причина для использования упаковки значения состоит в передаче его в метод, который ожидает в качестве параметра ссылочный тип. Можно также распаковать упакованное значение, преобразуя его просто назад в первоначальный тип данных.
int J = 10;
object BoxedJ = (object)J;
int K = (int)BoxedJ;
Отметим, что процесс распаковки будет инициировать исключение, если попытаться преобразовать значение к неправильному типу данных.
Управление памятью
В C++ переменные (включая экземпляры классов или структур) могут храниться в стеке или в куче. Обычно переменная хранится в куче, если она или некоторый содержащий ее класс был распределен с помощью оператора new
, или в противном случае помещается в стек. Это означает, что возможность выделить динамически память для переменной с помощью оператора new позволяет выбирать, будет ли переменная храниться в стеке либо в куче. (Хотя очевидно в связи со способом работы стека, что хранящиеся в стеке данные будут существовать до тех пор, пока соответствующая переменная находится в области действия.)
Интервал:
Закладка: