Чтение онлайн

на главную - закладки

Жанры

C# для профессионалов. Том II

Ватсон Карли

Шрифт:

checked {

 int I1 = -3;

 uint I2 = (uint)I1;

}

В связи с контролируемостью контекста вторая строка будет порождать исключение. Если не определить

checked
, исключения не возникнет и переменная
I2
будет содержать мусор.

Строки 

Обработка строк выполняется значительно легче в C#, чем это было раньше в C++. Это связано с понятием строки как базового типа данных, который распознается компилятором C#. В C# нет необходимости рассматривать строки как массивы символов.

Ближайшим эквивалентом для типа данных

string
в C# является
класс
string
в C++ в стандартной библиотеке. Однако строка C# отличается от строки C++ следующими основными свойствами.

□ Строка C# содержит символы Unicode, а не ANSI.

□ Строка C# имеет значительно больше методов и свойств, чем версия в C++.

□ Класс

string
стандартной библиотеки C++ является не более чем классом, предоставленным библиотекой, в то время как в C# синтаксис языка специально поддерживает класс
string
как часть языка.

Последовательности кодирования

C# использует тот же метод кодирования специальных символов, что и C++,— с помощью обратной наклонной черты. Вот список кодирования:

Последовательность Имя символа Кодировка Unicode
\'
Одиночная кавычка
0x0027
\"
Двойная кавычка
0x0022
\\
Обратный слэш
0х005C
\0
Null
0x0000
\a
Сигнал
0x0007
\b
Возврат на одну позицию
0x0008
\f
Перевод страницы
0x000C
\n
Новая строка
0x000A
\r
Возврат каретки
0x000D
\t
Горизонтальная табуляция
0x0009
\v
Вертикальная табуляция
0x000B

Это по сути означает, что в C# используются те же коды, что и в C++, за исключением того, что C# не распознает

\?
.

Имеются два отличия между символами кодирования в 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# невозможно программным путем объявить определенную переменную как тип значения или как ссылочный тип, это определяется исключительно типом данных переменной.

Тип значения и ссылочный тип данных имеют особенности в управлении памятью, так как ссылочные типы всегда хранятся в куче, в то время как типы значений обычно хранятся в стеке. Это рассматривается более подробно в следующем разделе об управлении памятью.

Инициализация переменных

Поделиться:
Популярные книги

Отверженный. Дилогия

Опсокополос Алексис
Отверженный
Фантастика:
фэнтези
7.51
рейтинг книги
Отверженный. Дилогия

Кодекс Крови. Книга V

Борзых М.
5. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга V

Идеальный мир для Лекаря 28

Сапфир Олег
28. Лекарь
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 28

Убивать чтобы жить 3

Бор Жорж
3. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 3

Бракованная невеста. Академия драконов

Милославская Анастасия
Фантастика:
фэнтези
сказочная фантастика
5.00
рейтинг книги
Бракованная невеста. Академия драконов

Кодекс Охотника. Книга XIX

Винокуров Юрий
19. Кодекс Охотника
Фантастика:
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга XIX

На распутье

Кронос Александр
2. Лэрн
Фантастика:
фэнтези
героическая фантастика
стимпанк
5.00
рейтинг книги
На распутье

Контракт на материнство

Вильде Арина
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Контракт на материнство

Волков. Гимназия №6

Пылаев Валерий
1. Волков
Фантастика:
попаданцы
альтернативная история
аниме
7.00
рейтинг книги
Волков. Гимназия №6

Элита элит

Злотников Роман Валерьевич
1. Элита элит
Фантастика:
боевая фантастика
8.93
рейтинг книги
Элита элит

Седьмая жена короля

Шёпот Светлана
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Седьмая жена короля

Измена. Наследник для дракона

Солт Елена
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Измена. Наследник для дракона

Темный Лекарь 5

Токсик Саша
5. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Темный Лекарь 5

Гримуар темного лорда IX

Грехов Тимофей
9. Гримуар темного лорда
Фантастика:
попаданцы
альтернативная история
аниме
фэнтези
5.00
рейтинг книги
Гримуар темного лорда IX