Основу любого языка программирования составляют его ключевые слова, посколь ку они определяют средства, встроенные в этот язык. В C# определены два общих типа ключевых слов: зарезервированные и контекстные. Зарезервированные ключевые слова нельзя использовать в именах переменных, классов или методов. Их можно использо вать только в качестве ключевых слов. Именно поэтому они и называются зарезервиро ванными. Их иногда еще называют зарезервированными словами, или зарезервированными идентификаторами. В настоящее время в версии 4.0 языка С# определено 77 зарезерви рованных ключевых слов (табл. 2.1).
Таблица 2.1. Ключевые слова, зарезервированные в языке C# abstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long namespace new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while
Кроме того, в версии C# 4.0 определены 18 контекстных ключевых слов, которые приобретают особое значение в определенном контексте. В таком контексте они вы полняют роль ключевых слов, а вне его они могут использоваться в именах других элементов программы, например в именах переменных. Следовательно, контекстные ключевые слова формально не являются зарезервированными. Но, как правило, их сле дует считать зарезервированными, избегая их применения в любых других целях. Ведь применение контекстного ключевого слова в качестве имени какого-нибудь другого элемента программы может привести к путанице, и поэтому считается многими про граммистами плохой практикой. Контекстные ключевые слова приведены в табл. 2.2. Таблица 2.2. Контекстные ключевые слова в C# add dynamic from get global group into join let orderby partial remove select set value var where yield Идентификаторы
В C# идентификатор представляет собой имя, присваиваемое методу, переменной или любому другому определяемому пользователем элементу программы. Идентифи каторы могут состоять из одного или нескольких символов. Имена переменных могут начинаться с любой буквы алфавита или знака подчеркивания. Далее может следовать буква, цифра или знак подчеркивания. С помощью знака подчеркивания можно по высить удобочитаемость имени переменной, как, например, line_count. Но иден тификаторы, содержащие два знака подчеркивания подряд, например, max__value, зарезервированы для применения в компиляторе. Прописные и строчные буквы в C# различаются. Так, например myvar и MyVar — это разные имена переменных. Ниже приведены некоторые примеры допустимых идентификаторов. Test x У2 MaxLoad up _top my_var sample23 Помните, что идентификатор не может начинаться с цифры. Например, 12х — недей ствительный идентификатор. Хорошая практика программирования требует выбирать идентификаторы, отражающие назначение или применение именуемых элементов. Несмотря на то что зарезервированные ключевые слова нельзя использовать в ка честве идентификаторов, в C# разрешается применять ключевое слово с предшествую щим знаком @ в качестве допустимого идентификатора. Например, @for — действи тельный идентификатор. В этом случае в качестве идентификатора фактически служит ключевое слово for, а знак @ просто игнорируется. Ниже приведен пример програм мы, демонстрирующей применение идентификатора со знаком @. // Продемонстрировать применение идентификатора со знаком @. using System; class IdTest { static void Main() { int @if; // применение ключевого слова if // в качестве идентификатора for(@if = 0; @if < 10; @if++) Console.WriteLine("@if равно " + @if); } }
Приведенный ниже результат выполнения этой программы подтверждает, что @if правильно интерпретируется в качестве идентификатора. @if равно 0 @if равно 1 @if равно 2 @if равно 3 @if равно 4 @if равно 5 @if равно 6 @if равно 7 @if равно 8 @if равно 9
Откровенно говоря, применять ключевые слова со знаком @ в качестве идентифи каторов не рекомендуется, кроме особых случаев. Помимо того, знак @ может пред шествовать любому идентификатору, но такая практика программирования считается плохой. Библиотека классов среды .NET Framework
В примерах программ, представленных в этой главе, применялись два встроен ных метода: WriteLine() и Write(). Как упоминалось выше, эти методы являются членами класса Console, относящегося к пространству имен System, которое опре деляется в библиотеке классов для среды .NET Framework. Ранее в этой главе пояс нялось, что среда C# опирается на библиотеку классов, предназначенную для среды .NET Framework, чтобы поддерживать операции ввода-вывода, обработку строк, ра боту в сети и графические пользовательские интерфейсы. Поэтому, вообще говоря, C# представляет собой определенное сочетание самого языка C# и стандартных классов .NET. Как будет показано далее, библиотека классов обеспечивает функциональные возможности, являющиеся неотъемлемой частью любой программы на С#. Для того чтобы научиться программировать на С#, нужно знать не только сам язык, но и уметь пользоваться стандартными классами. Различные элементы библиотеки классов для среды .NET Framework рассматриваются в части I этой книги, а в части II — сама библиотека по отдельным ее составляющим.
ГЛАВА 3. Типы данных, литералы
В этой главе рассматриваются три основополагающих элемента С#: типы данных, литералы и переменные. В целом, типы данных, доступные в языке программи рования, определяют те виды задач, для решения которых можно применять данный язык. Как и следовало ожидать, в C# предоставляется богатый набор встроенных типов дан ных, что делает этот язык пригодным для самого широкого применения. Любой из этих типов данных может служить для создания переменных и констант, которые в языке C# называются литералами. О значении типов данных
Типы данных имеют особенное значение в С#, посколь ку это строго типизированный язык. Это означает, что все операции подвергаются строгому контролю со стороны компилятора на соответствие типов, причем недопустимые операции не компилируются. Следовательно, строгий кон троль типов позволяет исключить ошибки и повысить на дежность программ. Для обеспечения контроля типов все переменные, выражения и значения должны принадлежать к определенному типу. Такого понятия, как "бестиповая" переменная, в данном языке программирования вообще не существует. Более того, тип значения определяет те опера ции, которые разрешается выполнять над ним. Операция, разрешенная для одного типа данных, может оказаться не допустимой для другого.
ПРИМЕЧАНИЕ В версии C# 4.0 внедрен новый тип данных, называемый dynamic и приводящий к отсрочке контроля типов до времени выполнения, вместо того чтобы производить подобный контроль во время компиляции. Поэтому тип dynamic является исключением из обычного правила контроля типов во время компиляции. Подробнее о типе dynamic речь пойдет в главе 17. Типы значений в C
В C# имеются две общие категории встроенных типов данных: типы значений и ссы лочные типы. Они отличаются по содержимому переменной. Если переменная от носится к типу значения, то она содержит само значение, например 3,1416 или 212. А если переменная относится к ссылочному типу, то она содержит ссылку на значение. Наиболее распространенным примером использования ссылочного типа является класс, но о классах и ссылочных типах речь пойдет далее в этой книге. А здесь рассма триваются типы значений.
В основу языка C# положены 13 типов значений, перечисленных в табл. 3.1. Все они называются простыми типами, поскольку состоят из единственного значения. (Иными словами, они не состоят из двух или более значений.) Они составляют основу системы типов С#, предоставляя простейшие, низкоуровневые элементы данных, которыми можно оперировать в программе. Простые типы данных иногда еще называют при митивными.
Таблица. 3.1. Типы значений в C# Тип Значение bool Логический, предоставляет два значения: “истина” или “ложь” byte 8-разрядный целочисленный без знака char Символьный decimal Десятичный (для финансовых расчетов) double С плавающей точкой двойной точности float С плавающей точкой одинарной точности int Целочисленный long Длинный целочисленный sbyte 8-разрядный целочисленный со знаком short Короткий целочисленный uint Целочисленный без знака ulong Длинный целочисленный без знака ushort Короткий целочисленный без знака
В C# строго определены пределы и характер действия каждого типа значения. Исходя из требований к переносимости программ, C# не допускает в этом отношении никаких компромиссов. Например, тип int должен быть одинаковым во всех средах выполнения. Но в этом случае отпадает необходимость переписывать код для кон кретной платформы. И хотя строгое определение размерности типов значений может стать причиной незначительного падения производительности в некоторых средах, эта мера необходима для достижения переносимости программ.
ПРИМЕЧАНИЕ Помимо простых типов, в C# определены еще три категории типов значений: перечисления, структуры и обнуляемые типы. Все они рассматриваются далее в этой книге. Целочисленные типы
В C# определены девять целочисленных типов: char, byte, sbyte, short, ushort, int, uint, long и ulong. Но тип char применяется, главным образом, для пред ставления символов и поэтому рассматривается далее в этой главе. Остальные восемь целочисленных типов предназначены для числовых расчетов. Ниже представлены их диапазон представления чисел и разрядность в битах. Тип Разрядность в битах Диапазон представления чисел byte 8 0-255 sbyte 8 -128-127 short 16 -32 768-32 767 ushort 16 0-65 535 int 32 -2 147 483 648-2 147 483 647 uint 32 0-4 294 967 295 long 64 -9 223 372 036 854 775 808-9 223 372 036 854 775 807 ulong 64 0-18 446 744 073 709 551 615