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

ЖАНРЫ

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

Ватсон Карли

Шрифт:

□ Все типы имеют метод T

oString
. Для базовых типов данных он возвращает строковое представление их значения.

□ 

char
содержит большое число свойств, которые предоставляют информацию о своем содержимом (
IsLetter
,
IsNumber
и т.д.), а также методы для выполнения преобразований (
ToUpper
,
ToLower
).

□ 

string
имеет очень большое число методов и свойств. Строки будут рассмотрены отдельно.

Также доступен ряд статических методов членов и свойств. Они включают следующие:

□ Целые типы имеют

MinValue
и
MaxValue
, чтобы указать минимальное и максимальное значения, которые могут содержаться в типе данных.

□ Типы данных

float
и
double
также имеют свойство
Epsilon
, которое указывает наименьшее возможное значение больше нуля, которое может в нем содержаться.

□ Отдельные значения —

NaN
(не число, которое не определено),
PositiveInfinity
(положительная бесконечность) и
NegativeInfinity
(отрицательная бесконечность) определены для
float
и
double
. Результаты вычисления будут возвращать эти значения в подходящих ситуациях, например, деление положительного числа на ноль будет иметь в результате
PositiveInfinity
, в то время как деление нуля на нуль создаст
NaN
. Эти значения доступны как статические свойства.

□ Многие типы, включая все числовые, имеют статический метод

Parse
, который позволяет преобразование из строки:
double D = double.Parse("20.5")
.

Отметим, что статические методы в C# вызываются определением имени типа данных:

int.MaxValue
и
float.Epsilon
.

Преобразования базовых типов данных

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

float f1 = 40.0;

long l1 = f1; // неявно

short s1 = (short)l1; // явно, старый стиль C

short s2 = short(f1); // явно, новый стиль C++

Если преобразование типа определяется явно, то это означает, что в коде явно указывается имя типа данных назначения. C++ позволяет написать явные преобразования типа любым из двух стилей — старым стилем С, в котором имя типа данных помещалось в скобки, или новым стилем, в котором имя переменной помещается в скобки. Оба стиля показаны выше и являются вопросом синтаксического предпочтения, выбор стиля не оказывает никакого влияния на код. В C++ допустимы преобразования любых базовых типов данных. Однако, если существует риск потери данных в связи с тем, что тип данных назначения имеет меньший диапазон значений, чем исходный тип данных, то компилятор может послать предупреждение в зависимости от настройки уровня предупреждений. В приведенном выше примере неявное преобразование типа может вызвать потерю данных, поэтому компилятор будет обычно порождать предупреждение. Явное определение преобразования является на самом деле способом сообщить компилятору что данное действие обдуманно, в результате это обычно приводит к подавлению всех предупреждений.

Так как C# создан с целью обеспечить большую безопасность типов, чем C++, он менее гибок в отношении преобразований между типами данных, Он также формализует понятие явного и неявного преобразования типов данных. Некоторые преобразования определены как неявные, что позволяет выполнить их либо с помощью неявного, либо явного синтаксиса. Другие можно делать только с помощью явного преобразования типов, и компилятор будет давать ошибку (а не предупреждение, как в C++), если попробовать выполнить его неявно.

Правила в C#, имеющие отношение к тому, какие базовые числовые типы данных могут быть преобразованы в другие типы данных, вполне логичны. Неявными преобразованиями будут преобразования, которые не создают риск потери данных, например,

int
в
long
или
float
в
double
. Явными преобразованиями являются такие, где может быть потеря данных в связи с ошибкой переполнения, ошибкой знака или потерей дробной части числа, например,
float
в
int
,
int
в
uint
или
short
в
ulong
. Кроме того, так как
char
рассматривается несколько отдельно от других целых типов данных, можно преобразовывать только явно в или из
char
.

Следующие выражения считаются допустимыми в коде C#:

float f1 = 40.0F;

long l1 = (long)f1; //
явное, так как возможна ошибка округления

short s1 = (short)l1; // явное, так как возможна ошибка переполнения

int i1 = s1; // неявное — никаких проблем

uint i2 = (uint)i1; // явное, так как возможна ошибка знака

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

uint i2 = uint(i1); // неверный синтаксис - это не будет компилироваться

Проверяемое (checked) преобразование типов данных

C# предлагает возможность выполнять преобразования типов и другие арифметические операции в проверяемом (checked) контексте. Это означает, что среда выполнения .NET будет обнаруживать возникновение переполнения и порождать исключение (конкретно,

OverFlowException
). Это свойство не имеет аналога в C++.

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
Поделиться с друзьями: