C# 数据类型

C#是一种强类型的语言。这意味着我们必须声明一个变量类型,该变量指示将要存储的值的类型,例如整数,浮点数,十进制,文本等。

以下声明和初始化了不同数据类型的变量。

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

C#主要将数据类型分为两种:值类型和引用类型。值类型包括简单类型(例如int,float,bool和char),枚举类型,结构类型和Nullable值类型。引用类型包括类类型,接口类型,委托类型和数组类型。在下一章中将详细了解值类型和引用类型。

C#数据类型

C#中的预定义数据类型

C#包括一些预定义的值类型和引用类型。下表列出了预定义的数据类型:

类型描述范围后缀
byte8 位无符号整数类型0 到 255
sbyte8 位有符号整数类型-128 到 127
short16 位有符号整数类型-32,768 到 32,767
ushort 16 位无符号整数类型0 到 65,535
int32 位有符号整数类型-2,147,483,648

2,147,483,647


uint32 位无符号整数类型0 到 4,294,967,295u
long64 位有符号整数类型-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

这意味着无论您定义的是int还是Int32,变量都相同。

int i = 345;
Int32 i = 345;// 同上

类型转换

某些数据类型的值会在C#中自动转换为不同的数据类型。这称为隐式转换。

int i = 345;
float f = i;

Console.WriteLine(f); //输出:345

在上面的实例中,整型变量 i 的值被赋给float类型 f 的变量,因为这个转换操作是在C#中预定义的。

以下是隐式数据类型转换表。

隐式转换
sbyteshort, int, long, float, double, decimal
byteshort, ushort, int, uint, long, ulong, float, double, decimal
shortint, long, float, double, or decimal
ushortint, uint, long, ulong, float, double, or decimal
intlong, float, double, or decimal.
uintlong, ulong, float, double, or decimal
longfloat, double, or decimal
ulongfloat, double, or decimal
charushort, int, uint, long, ulong, float, double, or decimal
floatDouble

从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。这将把整数转换成uint。