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

на главную

Жанры

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

Ватсон Карли

Шрифт:

Так как размер каждого из примитивных типов (примитивным типом является любой из приведенных выше, за исключением

string
и
object
) фиксирован в C#, то существует меньшая потребность в операторе
sizeof
, хотя он и есть в C#, но допустим только в ненадежном коде (как будет описано позже).

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

signed
и
unsigned
не являются ключевыми словами в C# (в C++ можно использовать эти ключевые слова, также как
long
и
short
для модификации других типов данных (например,
unsigned long
,
short int
). Такие модификации недопустимы в C#, поэтому приведенная выше таблица является фактически полным списком предопределенных типов данных.

Базовые типы данных как объекты

В отличие от C++ (но как в Java) базовые типы данных в C# трактуются как объекты, чтобы вызывать на них некоторые методы. Например, в C# возможно преобразование целого числа в строку следующим образом.

int I = 10;

string Y = I.ToString;

Можно даже написать:

string Y = 10.ToString;

Тот факт, что базовые типы данных рассматриваются как объекты, показывает тесную связь между C# и библиотекой базовых классов .NET. C# компилирует базовые типы данных, отображая каждый из них в один из базовых классов, например,

string
отображается в
System.String
,
int
в
System.Int32
и т.д. Поэтому на самом деле в C# все является объектом. Однако отметим, что это применимо только для синтаксических целей. В реальности при выполнении кода эти типы реализуются как описанные ниже типы промежуточного языка, поэтому нет потери производительности, связанной с интерпретацией базовых типов как объектов. Здесь не будут перечисляться все методы, доступные для базовых типов данных, так как подробности представлены в MSDN. Однако необходимо отметить следующие особенности:

□ Все типы имеют метод 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++.

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

Мастер Разума 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
рейтинг книги
Невеста напрокат