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

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

Жанры

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

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

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

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

Мастер Разума V

Кронос Александр
5. Мастер Разума
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Мастер Разума V

Последний из рода Демидовых

Ветров Борис
Фантастика:
детективная фантастика
попаданцы
аниме
5.00
рейтинг книги
Последний из рода Демидовых

Любовь Носорога

Зайцева Мария
Любовные романы:
современные любовные романы
9.11
рейтинг книги
Любовь Носорога

Авиатор: назад в СССР 12

Дорин Михаил
12. Покоряя небо
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Авиатор: назад в СССР 12

Толян и его команда

Иванов Дмитрий
6. Девяностые
Фантастика:
попаданцы
альтернативная история
7.17
рейтинг книги
Толян и его команда

Академия

Кондакова Анна
2. Клан Волка
Фантастика:
боевая фантастика
5.40
рейтинг книги
Академия

Изгой. Пенталогия

Михайлов Дем Алексеевич
Изгой
Фантастика:
фэнтези
9.01
рейтинг книги
Изгой. Пенталогия

Неудержимый. Книга IX

Боярский Андрей
9. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга IX

Невеста

Вудворт Франциска
Любовные романы:
любовно-фантастические романы
эро литература
8.54
рейтинг книги
Невеста

Энфис 2

Кронос Александр
2. Эрра
Фантастика:
героическая фантастика
рпг
аниме
5.00
рейтинг книги
Энфис 2

Убийца

Бубела Олег Николаевич
3. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Убийца

Лорд Системы

Токсик Саша
1. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
4.00
рейтинг книги
Лорд Системы

Делегат

Астахов Евгений Евгеньевич
6. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Делегат

Невеста напрокат

Завгородняя Анна Александровна
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Невеста напрокат