English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tipi di dati di C#

C# is a strongly typed language. This means that we must declare a variable type that indicates the type of value to be stored, such as integer, float, decimal, text, etc.

The following statements and initializations declare and initialize variables of different data types.

string stringVar = "Hello World!!";
int intVar = 100;
float floatVar = 10.2f;
char charVar = 'A';
bool boolVar = true;

C# mainly divides data types into two types: value types and reference types. Value types include simple types (such as int, float, bool, and char), enum types, struct types, and nullable value types. Reference types include class types, interface types, delegate types, and array types. Value types and reference types will be introduced in detail in the next chapter.

Tipi di dati predefiniti in C#

C# include some predefined value types and reference types. The following table lists the predefined data types:

类型DescrizioneIntervalloSuffisso
byteTipo di intero a 8 bit senza segnoda 0 a 255
sbyteTipo di intero a 8 bit con segnoda -128 a 127
shortTipo di intero a 16 bit con segnoda -32,768 a 32,767
ushort Tipo di intero a 16 bit senza segnoda 0 a 65,535
intTipo di intero a 32 bit con segno-2,147,483,648

2,147,483,647


uintTipo di intero a 32 bit senza segnoda 0 a 4,294,967,295u
longTipo di intero a 64 bit-9,223,372,036,854,775,808

9,223,372,036,854,775,807
l
ulong64 位无符号整数类型0 到 18,446,744,073,709,551,615ul
float32 位单精度浮点型-3.402823e38 到 3.402823e38f
double64 位双精度浮点型-1.79769313486232e308 to 1.79769313486232e308d
decimal128 位精确的十进制值,28-29 有效位数(+ 或-)1.0 x 10e-28  到 7.9 x 10e28m
char16 位 Unicode 字符任何有效的字符,例如 a,*, \x0058 (hex), or\u0058 (Unicode)
bool8 位逻辑 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。因此,如果分配的值不在此范围内,则编译器将给出错误。

    示例:编译时错误

// 编译时错误:无法将类型'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类型

预定义的数据类型为其.NET类型(CLR类)名称的别名。下表列出了预定义数据类型的别名和相关的.NET类名称。

别名.NET类型类型
byteSystem.Bytestruct
sbyteSystem.SBytestruct
intSystem.Int32struct
uintSystem.UInt32struct
shortSystem.Int16struct
ushortSystem.UInt16struct
longSystem.Int64struct
ulongSystem.UInt64struct
floatSystem.Singlestruct
doubleSystem.Doublestruct
charSystem.Charstruct
boolSystem.Booleanstruct
objectSystem.ObjectClass
stringSystem.StringClass
decimalSystem.Decimalstruct
DateTimeSystem.DateTimestruct

Questo significa che, indipendentemente dal tipo di dati che definisci, int o Int32, la variabile è la stessa.

int i = 345;
Int32 i = 345; // Come sopra

Conversione di tipo

I valori di certi tipi di dati vengono automaticamente convertiti in diversi tipi di dati in C#. Questo si chiama conversione implicita.

int i = 345;
float f = i;
Console.WriteLine(f); // Output: 345

Nell'esempio sopra, il valore della variabile intera i è assegnato alla variabile di tipo float f, poiché questa operazione di conversione è predefinita in C#.

Di seguito è riportata la tabella delle conversioni implicite dei tipi di dati.

conversione implicitaa
sbyteshort, int, long, float, double decimal
byteshort, ushort, int, uint, long, ulong, float, double, decimal
shortint, long, float, double o decimal
ushortint, uint, long, ulong, float, double o decimal
intlong, float, double o decimal.
uintlong, ulong, float, double o decimal
longfloat, double o decimal
ulongfloat, double o decimal
charushort, int, uint, long, ulong, float, double o decimal
floatDouble

La conversione da int, uint, long o ulong a float e la conversione da long o ulong a double può causare una perdita di precisione. Non esiste una conversione implicita di tipo di dati in char.

Ma non tutti i tipi di dati si convertono implicitamente in altri tipi di dati. Ad esempio, il tipo int non si può convertire implicitamente in uint. Deve essere specificato chiaramente, come segue.

public static void Main()
{
    int i = 100;
    uint u = (uint) i;
    Console.Write(i);
}

Nell'esempio sopra, l'intero i viene esplicitamente convertito in uint tramite l'indicazione uint nel parentesi (uint) i. Questo convertirà l'intero in uint.