- •2. ЯЗЫК C# – ОБЩИЕ КОНЦЕПЦИИ СИНТАКСИСА
- •4. ПРЕОБРАЗОВАНИЯ ТИПОВ
- •6. ОБЪЯВЛЕНИЕ ПЕРЕМЕННЫХ, ПОЛЕЙ И КОНСТАНТ
- •10. МАССИВЫ В C#
- •11. РАБОТА С СИМВОЛАМИ И СТРОКАМИ В C#
- •13. СВОЙСТВА И ИНДЕКСАТОРЫ
- •14. КОНСТРУКТОРЫ КЛАССА И ЖИЗНЕННЫЙ ЦИКЛ ОБЪЕКТА
- •16. ПЕРЕГРУЗКА ОПЕРАЦИЙ
- •18. СОБЫТИЯ
- •19. ИНТЕРФЕЙСЫ
- •22. ГЕНЕРАЦИЯ И ОБРАБОТКА ИСКЛЮЧИТЕЛЬНЫХ СИТУАЦИЙ
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Р |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
И |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
У |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Г |
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Б |
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
а |
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рис. 2. Иерархия типов .NET Framework |
|
|
|
|
|
|
|
|
|
||||||||||||||||||
|
|
|
|
В C# допускается рассмотр |
ние |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
знач ний структурных типов как перемен- |
|||||||||||||||||||||||||||||||||||
ных типа |
|
|
|
|
|
|
|
|
|
т |
|
|
называется операцией упаковки |
||||||||||||||||||||||||||||
object. Преобразование вктобъ |
(boxing), обратное преобразование – оп рацией распаковки (unboxing). При упаковке в динамической памя и создае ся объект, содержащий значение структурного типа. При распак вке проверяется фактический тип объекта, и значе-
ние из динамической |
|
переписывается в соответствующую переменную |
||
в стеке. Операция распак вки требует явного указания целевого типа. |
||||
int i = 123; |
|
о |
|
|
|
|
|
// Упаковка |
|
object o = i; |
|
|
||
|
памяти |
|
// Распаковка |
|
int j = (int)o; |
|
|
||
л |
|
|
|
|
Возможность автоматического преобразование каждого типа в тип object |
||||
позволяет бсоздавать универсальные классы, работающие с любыми типами. |
Напр мер, класс ArrayList может содержать коллекцию пользовательских |
|
объектовили, |
целых чисел или строк. |
Б |
4. ПРЕОБРАЗОВАНИЯ ТИПОВ |
Если при вычислении выражения операнды имеют разные типы, то возникает необходимость приведения их к одному типу. Такая необходимость возникает и тогда, когда операнды имеют один тип, но он несогласован с типом операции. Например, при выполнении сложения операнды типа byte должны быть приведены к типу int, поскольку сложение не определено над байтами. При
10
выполнении присваивания x=e тип источника e и тип цели x должны быть согласованы. Аналогично, при вызове метода также должны быть согласованы типы фактического и формального аргументов.
Рассмотрим преобразования при работе с числовыми типами. Заметим, что преобразование типов бывает неявным и явным. Неявное преобразование (implicit conversion) выполняется автоматически. При выполнении данного преобразования никогда не происходит потеря точности или переполнение, так как
множество значений целевого типа включает множества значений приводимого типа. Для числовых типов неявное преобразование типа A в тип B возможно, если на схеме 3 существует путь из A в B.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Р |
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
И |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рис. 3. Схема неявного преобразования числовых типов. |
|||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
У |
|
|
|
|
|
|
|
|||
|
Для явного преобразования (explicit conversion) требуется применять опе- |
||||||||||||||||||||||||
ратор приведения в форме (<целевой |
|
|
|
Г |
|
|
|
|
|
|
|
|
|||||||||||||
тип>)<выражение>. При выполнении |
|||||||||||||||||||||||||
явного преобразования |
ответственность |
|
его корректность возлагается на |
||||||||||||||||||||||
программиста. |
|
|
|
|
|
Б |
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
за |
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
int k = 100; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
byte i; |
//тип byte «меньше» типа int |
|
|
|
|
|
|
|
||||||||||||||||
|
i = (byte) k; |
//тр буктся явное преобразование типов |
|||||||||||||||||||||||
|
|
|
|
|
|
|
е |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Для более гибкого кон роля знач ний, получаемых при работе с числовыми выражениями, в языке C# предусмотрено использование контролируемого и
неконтролируемого |
к н екс в. Контролируемый |
контекст объявляется в |
|||||
|
|
ибо |
блок>, |
|
|
|
|
форме |
checked |
<пртграммный |
либо |
как |
оператор |
||
|
л |
|
|
|
|
|
|
checked(<выражен е>)о. Если при преобразовании типов выражение в контро- |
|||||||
лируемом контексте получает значение, выходящие за пределы целевого типа, |
|||||||
то генерируется |
|
ошибка компиляции (для константных выражений), либо |
|||||
ошибка времени выпо нения (для выражений с переменными). |
|
|
|||||
При |
|
|
|
|
|
|
|
Б |
спользовании неконтролируемого контекста выход за пределы це- |
левого т бпа ведет к автоматическому «урезанию» результата либо путем отбра-
сыван я б т (целые типы), либо путем округления (вещественные типы). Не-
контролируемый контекст объявляется в форме unchecked <программный блок>, либо как оператор unchecked(<выражение>).
Рассмотрим несколько примеров использования контекстов:
int i = 1000000; int k = 1000000; int n = i * k;
11
В данном примере n получит значение -727379968, то есть произойдет отбрасывание «лишних» бит числа, получившегося в результате умножения. Используем неконтролируемый контекст:
int i = 1000000; int k = 1000000;
int n = unchecked(i * k);
Значение n осталось прежним (-727379968), таким образом, неконтролируемый контекст применяется по умолчанию.
Теперь проведем вычисления в контролируемом контексте:
int i |
= 1000000; |
Р |
||
int |
k |
= |
1000000; |
|
int |
n |
= |
checked(i * k); |
|
|
|
|
|
|
При выполнении последнего оператора произойдет генерация исключения |
System.OverflowException – переполнение. |
|
Важным классом преобразований являются преобразованияИв строковый |
|
|
У |
тип и наоборот. Преобразования в строковый тип всегда определены, поскольку
все типы являются потомками базового класса object, а, следовательно, обла- |
|
дают методом ToString() этого класса. Для встроенныхГтипов определена |
|
огда |
|
подходящая реализация этого метода. В частности, для всех числовых типов |
|
метод ToString() возвращает строку, з д ющуюБсоответствующее значение |
|
к |
|
типа. Метод ToString() можно вызывать явно, но, если явный вызов не указан, |
|
то он будет вызываться неявно, вся ий раз, |
требуется преобразование к |
строковому типу. Преобразования из стро ового типа в другие типы должны
всегда выполняться явно при помощи м тодов встроенных или пользователь- |
|||
ских классов. Например, класс System.Int32е |
обладает методом Parse(), по- |
||
зволяющим преобразовать с р ку в целое число. |
|||
System.Console.WriteLine("Input your age"); |
|||
|
|
т |
|
string s = System.Console.ReadLine(); |
|||
int Age = System.Int32.Parse(s);о |
|
||
б |
в типы sbyte, short, byte явно, а в остальные чи- |
||
Тип char |
преобразуетсяи |
||
словые типы – неявно. Заметим, что преобразование любого числового типа в |
|||
тип char можетлыть выполнено, но только в явной форме. |
|||
Прео разования пользовательских ссылочных типов выполняются при |
|||
присва ван |
вызове методов. При этом |
действует стандартное правило |
|
ООП: объектитипа-потомка преобразуется в объект типа-предка автоматически. |
Все прочие преобразования должны быть выполнены при помощи оператора |
|
приведенияБ |
. Ответственность за их правильность возлагается на программиста. |
В пространстве имен System содержится класс Convert, методы которого |
поддерживают общий способ выполнения преобразований между типами. Класс Convert содержит набор статических методов вида To<Type>(), где Type – имя встроенного типа CLR (ToBoolean(),ToUInt64() и т. д.). Все методы To<Type>() класса Convert перегружены и каждый из них имеет, как правило,
12
более десятка реализаций с аргументами разного типа. Так что фактически эти методы задают все возможные преобразования между всеми встроенными типами языка C#. Кроме методов, задающих преобразования типов, в классе Convert имеются и другие методы, например, задающие преобразования символов Unicode в однобайтную кодировку ASCII.
5. ИДЕНТИФИКАТОРЫ, КЛЮЧЕВЫЕ СЛОВА И ЛИТЕРАЛЫ
Идентификатор – это пользовательское имя для переменной, константы, метода или типа. В C# идентификатор – это произвольная последовательность букв, цифр и символов подчеркивания, начинающаяся с буквы, символа подчеркивания, либо с символа @. Идентификатор должен быть уникальным внутри области использования. Он не может совпадать с ключевым словом языка, за
исключением того случая, когда используется специальный префикс @. Приме- |
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
Р |
ры допустимых идентификаторов: Temp, _Variable, @class (используется пре- |
||||||||||||
фикс @, class – ключевое слово). |
|
|
|
|
|
И |
||||||
|
|
|
|
|
|
|
|
|
|
|
||
Далее представлен список всех ключевых слов языка 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 |
|
а |
|
namespace |
||||
|
|
|
|
long |
|
|||||||
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 |
using |
ulong |
|
unchecked |
|||||
unsafe |
|
ushort |
virtual |
void |
||||||||
volatile |
whileо |
|
|
|
|
|
|
|
|
|||
В C# |
|
и– это последовательность символов, которая может интер- |
||||||||||
претироваться как значение одного из примитивных типов. Так как язык C# яв- |
||||||||||||
|
итерал |
|
|
|
|
|
|
|
|
|
|
|
ляется языком со строгой типизацией, иногда необходимо явно указать, к како- |
||||||||||||
му т пу относится последовательность символов, определяющая данные. |
||||||||||||
б |
|
|
|
|
|
|
|
|
|
|
|
|
Рассмотрим правила записи некоторых литералов. В языке C# два булевых |
||||||||||||
литералаи: true и false. Целочисленные литералы могут быть записаны в деся- |
тичнойБили шестнадцатеричной форме. Признаком шестнадцатеричного литерала является префикс 0x. Конкретный тип целочисленного литерала определяется следующим образом:
Если литерал не имеет суффикса, то его тип – это первый из типов int, uint, long, ulong, который способен вместить значение литерала.
Если литерал имеет суффикс U или u, его тип – это первый из типов uint, ulong, который способен вместить значение литерала.
13