C# - 数据类型
C# 是一种强类型语言。这意味着我们必须声明变量的类型,以指示它将存储的值的种类,例如整数、浮点数、十进制数、文本等。
以下声明并初始化了不同数据类型的变量。
string stringVar = "Hello World!!";
int intVar = 100;
float floatVar = 10.2f;
char charVar = 'A';
bool boolVar = true;
C# 主要将数据类型分为两类:值类型和引用类型。值类型包括简单类型(如 int、float、bool 和 char)、枚举类型、结构类型和可空值类型。引用类型包括类类型、接口类型、委托类型和数组类型。有关值类型和引用类型的详细信息,请参阅下一章。

C# 中预定义的数据类型
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 位十进制类型 | (+ 或 -)1.0 x 10e-28 到 7.9 x 10e28 | m |
char | 16 位单个 Unicode 字符 | 任何有效字符,例如 a,*, \x0058 (十六进制), 或 \u0058 (Unicode) | |
bool | 8 位逻辑真/假值 | 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。因此,如果您分配一个不在该范围内的值,编译器将报错。
// compile time error: Cannot implicitly convert type 'long' to '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 类型 | 类型 |
---|---|---|
byte | System.Byte | 结构 |
sbyte | System.SByte | 结构 |
int | System.Int32 | 结构 |
uint | System.UInt32 | 结构 |
short | System.Int16 | 结构 |
ushort | System.UInt16 | 结构 |
long | System.Int64 | 结构 |
ulong | System.UInt64 | 结构 |
float | System.Single | 结构 |
double | System.Double | 结构 |
char | System.Char | 结构 |
bool | System.Boolean | 结构 |
object | System.Object | 类名 |
string | System.String | 类名 |
decimal | System.Decimal | 结构 |
DateTime | System.DateTime | 结构 |
这意味着无论您定义一个 int
变量还是 Int32
变量,它们都是相同的。
默认值
每种数据类型都有一个默认值。数值类型为 0,布尔类型为 false,char 的默认值为 '\0'
。使用 default(typename)
分配数据类型的默认值,或者从 C# 7.1 开始,使用默认字面量。
int i = default(int); // 0
float f = default(float);// 0
decimal d = default(decimal);// 0
bool b = default(bool);// false
char c = default(char);// ''
// C# 7.1 onwards
int i = default; // 0
float f = default;// 0
decimal d = default;// 0
bool b = default;// false
char c = default;// ''
转换
C# 中某些数据类型的值会自动转换为不同的数据类型。这称为隐式转换。
int i = 345;
float f = i;
Console.WriteLine(f); //output: 345
在上面的示例中,整数变量 i
的值被赋给浮点类型变量 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 类型。
然而,并非所有数据类型都隐式转换为其他数据类型。例如,int 类型不能隐式转换为 uint。它必须显式指定,如下所示。
public static void Main()
{
int i = 100;
uint u = (uint) i;
Console.Write(i);
}
在上面的示例中,整数 i
通过在括号中指定 uint 来显式转换为 uint。这将把整数转换为 uint。
- 在 C# 中将字符串转换为整数。
- C# 中的装箱和拆箱。
- 转换