English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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.
C# include some predefined value types and reference types. The following table lists the predefined data types:
类型 | Descrizione | Intervallo | Suffisso |
---|---|---|---|
byte | Tipo di intero a 8 bit senza segno | da 0 a 255 | |
sbyte | Tipo di intero a 8 bit con segno | da -128 a 127 | |
short | Tipo di intero a 16 bit con segno | da -32,768 a 32,767 | |
ushort | Tipo di intero a 16 bit senza segno | da 0 a 65,535 | |
int | Tipo di intero a 32 bit con segno | -2,147,483,648 到 2,147,483,647 | |
uint | Tipo di intero a 32 bit senza segno | da 0 a 4,294,967,295 | u |
long | Tipo di intero a 64 bit | -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 to 1.79769313486232e308 | d |
decimal | 128 位精确的十进制值,28-29 有效位数 | (+ 或-)1.0 x 10e-28 到 7.9 x 10e28 | m |
char | 16 位 Unicode 字符 | 任何有效的字符,例如 a,*, \x0058 (hex), or\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。因此,如果分配的值不在此范围内,则编译器将给出错误。
示例:编译时错误
// 编译时错误:无法将类型'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 |
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
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 implicita | a |
---|---|
sbyte | short, int, long, float, double decimal |
byte | short, ushort, int, uint, long, ulong, float, double, decimal |
short | int, long, float, double o decimal |
ushort | int, uint, long, ulong, float, double o decimal |
int | long, float, double o decimal. |
uint | long, ulong, float, double o decimal |
long | float, double o decimal |
ulong | float, double o decimal |
char | ushort, int, uint, long, ulong, float, double o decimal |
float | Double |
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.