Герберт Шилдт - C# 4.0: полное руководство
- Название:C# 4.0: полное руководство
- Автор:
- Жанр:
- Издательство:ООО И.Д. Вильямс
- Год:2011
- Город:Москва -- Киев
- ISBN:978-5-8459-1684-6
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Герберт Шилдт - C# 4.0: полное руководство краткое содержание
В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки.
Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию
C# 4.0: полное руководство - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
// Продемонстрировать применение описателя ::.
using System;
using Counter;
using AnotherCounter;
// Присвоить классу Counter псевдоним Ctr.
using Ctr = Counter;
// Объявить пространство имен для счетчиков,
namespace Counter {
// Простой вычитающий счетчик,
class CountDown {
int val;
public CountDown(int n) {
val = n;
}
}
}
// Объявить еще одно пространство имен для счетчиков,
namespace AnotherCounter {
// Объявить еще один класс CountDown, принадлежащий
// пространству имен AnotherCounter.
class CountDown {
int val;
public CountDown(int n) {
val = n;
}
// ...
}
}
class AliasQualifierDemo {
static void Main() {
// Здесь оператор :: разрешает конфликт, предписывая компилятору
// использовать класс CountDown из пространства имен Counter.
Ctr::CountDown cd1 = new Ctr::CountDown(10);
// ...
}
}
В этом варианте программы для класса Counter
сначала указывается псевдоним Ctr
в следующей строке кода.
using Ctr = Counter;
А затем этот псевдоним используется в методе Main()
для дополнительного описания класса CountDown
, как показано ниже.
Ctr::CountDown cd1 = new Ctr::CountDown(10);
Описатель ::
устраняет неоднозначность, поскольку он явно указывает на то, что следует обратиться к классу CountDown
из пространства Ctr
, а фактически — Counter
. Именно это и делает теперь программу пригодной для компиляции.
Описатель ::
можно также использовать вместе с предопределенным идентификатором global
для ссылки на глобальное пространство имен. Например, в приведенной ниже программе класс CountDown
объявляется как в пространстве имен Counter
, так и в глобальном пространстве имен. А для доступа к варианту класса CountDown
в глобальном пространстве имен служит предопределенный псевдоним global
.
// Использовать псевдоним глобального пространства имен,
using System;
// Присвоить классу Counter псевдоним Ctr.
using Ctr = Counter;
namespace Counter {
// Простой вычитающий счетчик,
class CountDown { int val;
public CountDown(int n) {
val = n;
}
//...
}
}
// Объявить еще один класс CountDown, принадлежащий
// глобальному пространству имен,
class CountDown {
int val;
public CountDown(int n) {
val = n;
}
// ...
}
class GlobalAliasQualifierDemo {
static void Main() {
// Здесь описатель :: предписывает компилятору использовать
// класс CountDown из пространства имен Counter.
Ctr::CountDown cd1 = new Ctr::CountDown(10);
// Далее создать объект класса CountDown из
// глобального пространства имен.
global::CountDown cd2 = new global::CountDown(10) ;
// ...
}
}
Обратите внимание на то, что идентификатор global
служит для доступа к классу CountDown
из используемого по умолчанию пространства имен.
global::CountDown cd2 = new global::CountDown(10) ;
Этот подход можно распространить на любую ситуацию, в которой требуется указывать используемое по умолчанию пространство имен.
И последнее: описатель псевдонима пространства имен можно применять вместе с псевдонимами типа extern
, как будет показано в главе 20.
Препроцессор
В C# определен ряд директив препроцессора, оказывающих влияние на интерпретацию исходного кода программы компилятором. Эти директивы определяют порядок интерпретации текста программы перед ее трансляцией в объектный код в том исходном файле, где они появляются. Термин директива препроцессора появился в связи с тем, что подобные инструкции по традиции обрабатывались на отдельной стадии компиляции, называемой препроцессором. Обрабатывать директивы на отдельной стадии препроцессора в современных компиляторах уже не нужно, но само ее название закрепилось.
Ниже приведены директивы препроцессора, определенные в С#.
# define
#elif
#else
#endif
#endregion
#error
#if
#line
#pragma
#region
#undef
#warning
Все директивы препроцессора начинаются со знака #. Кроме того, каждая директива препроцессора должна быть выделена в отдельную строку кода.
Принимая во внимание современную объектно-ориентированную архитектуру языка С#, потребность в директивах препроцессора в нем не столь велика, как в языках программирования предыдущих поколений. Тем не менее они могут быть иногда полезными, особенно для условной компиляции. В этом разделе все директивы препроцессора рассматриваются по очереди.
Директива #define
определяет последовательность символов, называемую идентификатором. Присутствие или отсутствие идентификатора может быть определено с помощью директивы #if
или #elif
и поэтому используется для управления процессом компиляции. Ниже приведена общая форма директивы #define
.
#define идентификатор
Обратите внимание на отсутствие точки с запятой в конце этого оператора. Между директивой #define
и идентификатором может быть любое количество пробелов, но после самого идентификатора должен следовать только символ новой строки. Так, для определения идентификатора EXPERIMENTAL служит следующая директива.
#define EXPERIMENTAL
------------------------------------
ПРИМЕЧАНИЕ
В C/C++ директива #define может использоваться для подстановки исходного текста, например для определения имени значения, а также для создания макрокоманд, похожих на функции. А в C# такое применение директивы #define не поддерживается. В этом языке директива #define служит только для определения идентификатора.
------------------------------------
Обе директивы, #if
и #endif
, допускают условную компиляцию последовательности кода в зависимости от истинного результата вычисления выражения, включающего в себя один или несколько идентификаторов. Идентификатор считается истинным, если он определен, а иначе — ложным. Так, если идентификатор определен директивой #define
, то он будет оценен как истинный. Ниже приведена общая форма директивы #if
.
Интервал:
Закладка: