English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
C# является языком с сильной типизацией. Это означает, что我们必须 определить тип переменной, которая указывает на тип значения, которое будет храниться, например, целое число,浮-point, decimal, текст и т.д.
Ниже приведены примеры declarations и initialization различных типов данных.
string stringVar = "Hello World!!"; int intVar = 100; float floatVar = 10.2f; char charVar = 'A'; bool boolVar = true;
C# в основном разделяет типы данных на два типа: типы значений и типы ссылок. Типы значений включают простые типы (например, int, float, bool и char), типы枚ераций, типы структур и типы Nullable значений. Типы ссылок включают типы классов, типы интерфейсов, типы делегатов и типы массивов. В следующей главе более подробно рассмотрим типы значений и типы ссылок.
C# включает некоторые предопределенные типы значений и типы ссылок. В таблице ниже перечислены предопределенные типы данных:
Тип | описание | диапазон | суффикс |
---|---|---|---|
byte | 8-битный беззнаковый целочисленный тип | от 0 до 255 | |
sbyte | 8-битный целочисленный тип | от -128 до 127 | |
short | 16-битный целочисленный тип | от -32 768 до 32 767 | |
ushort | 16-битный беззнаковый целочисленный тип | от 0 до 65 535 | |
int | 32-битный целочисленный тип | -2 147 483 648 до 2 147 483 647 | |
uint | 32-битный беззнаковый целочисленный тип | от 0 до 4 294 967 295 | u |
long | 64-битный целочисленный тип | -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807 | l |
ulong | 64-битный тип беззнакового целого | 0 до 18,446,744,073,709,551,615 | ul |
float | 32-битный одинарный точностный тип с плавающей запятой | -3.402823e38 до 3.402823e38 | f |
double | 64-битный двойной точностный тип с плавающей запятой | -1.79769313486232e308 до 1.79769313486232e308 | d |
decimal | 128-битная точная десятичная величина, 28-29 значащих цифр | (+ или-)1.0 x 10e-28 до 7.9 x 10e28 | m |
char | 16-битный Unicode-символ | Любой.valid character, например a, *, \x0058 (hex), или\u0058 (Unicode) | |
bool | 8-битные логические значения true/false | True или False | |
object | Базовый класс всех типов | ||
string | Unicode-символьная последовательность | ||
DateTime | 表示日期和时间 | 0:00:00am 1/1/01 до 11:59:59pm 12/31/9999 |
Как показано в таблице,每种数据类型 (исключая строки и объекты) содержит диапазон значений. Если значение выходит за пределы разрешенного диапазона типа данных, компилятор выдает ошибку. Например, диапазон типа данных int составляет от -2,147,483,648 до 2,147,483,647. Поэтому, если значение, назначенное для переменной, не находится в этом диапазоне, компилятор выдает ошибку.
Пример: ошибка компиляции
// Ошибка компиляции: не удалось импlicitно преобразовать тип 'long' в 'int'. int i = 21474836470;
Значения беззнаковых целых, типов long, float, double и decimal должны заканчиваться суффиксами u, l, f, d и m соответственно.
uint ui = 100u; float fl = 10.2f; long l = 45755452222222l; ulong ul = 45755452222222ul; double d = 11452222.555d; decimal mon = 1000.15m;
Предопределенные данные типы являются псевдонимами для имен классов типа .NET (CLR). В таблице приведены псевдонимы предопределенных типов данных и соответствующие имена классов .NET.
Псевдоним | Тип .NET | Тип |
---|---|---|
byte | System.Byte | struct |
sbyte | System.SByte | struct |
int | System.Int32 | struct |
uint | System.UInt32 | struct |
short | System.Int16 | struct |
ushort | System.UInt16 | struct |
long | System.Int64 | struct |
ulong | System.UInt64 | struct |
float | System.Single | struct |
double | System.Double | struct |
char | System.Char | struct |
bool | System.Boolean | struct |
object | System.Object | Class |
string | System.String | Class |
decimal | System.Decimal | struct |
DateTime | System.DateTime | struct |
Это означает, что переменная одинакова, независимо от того, определена ли она как int или Int32.
int i = 345; Int32 i = 345; // Тоже самое
Значения некоторых типов данных автоматически преобразуются в другие типы данных в C#. Это называется неявным преобразованием.
int i = 345; float f = i; Console.WriteLine(f); // Вывод: 345
В приведенном выше примере значение переменной типа int i передается в переменную типа float f, так как это преобразование определено предварительно в C#.
Ниже приведена таблица неявного преобразования типов данных.
Неявное преобразование | До |
---|---|
sbyte | short, int, long, float, double, decimal |
byte | short, ushort, int, uint, long, ulong, float, double, decimal |
short | int, long, float, double или decimal |
ushort | int, uint, long, ulong, float, double или decimal |
int | long, float, double или decimal. |
uint | long, ulong, float, double или decimal |
long | float, double или decimal |
ulong | float, double или decimal |
char | ushort, int, uint, long, ulong, float, double или decimal |
float | Double |
Преобразование из int, uint, long или ulong в float, а также преобразование из long или ulong в double может привести к потере точности. Не существует неявного преобразования данных в тип char.
Но не все типы данных могут быть импlicitly преобразованы в другие типы данных. Например, тип int не может быть импlicitly преобразован в uint. Его необходимо явно指定, как показано ниже.
public static void Main() { int i = 100; uint u = (uint) i; Console.Write(i); }
В примере выше, целое число i явно преобразуется в uint в скобках (uint). Это преобразует целое число в uint.