C# 数据类型
C#是一种强类型的语言。这意味着我们必须声明一个变量类型,该变量指示将要存储的值的类型,例如整数,浮点数,十进制,文本等。
以下声明和初始化了不同数据类型的变量。
stringstringVar="HelloWorld!!";intintVar=100;floatfloatVar=10.2f;charcharVar='A';boolboolVar=true;
C#主要将数据类型分为两种:值类型和引用类型。值类型包括简单类型(例如int,float,bool和char),枚举类型,结构类型和Nullable值类型。引用类型包括类类型,接口类型,委托类型和数组类型。在下一章中将详细了解值类型和引用类型。
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 to 1.79769313486232e308 | d |
decimal | 128 位精确的十进制值,28-29 有效位数 | (+ 或-)1.0 x 10e-28 到 7.9 x 10e28 | |
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'。inti=21474836470;
无符号整数,long,float,double和decimal类型的值必须分别以u,l,f,d和m为后缀。
uintui=100u;floatfl=10.2f;longl=45755452222222l;ulongul=45755452222222ul;doubled=11452222.555d;decimalmon=1000.15m;
别名与.NET类型
预定义的数据类型为其.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,变量都相同。
inti=345;Int32i=345;//同上
类型转换
某些数据类型的值会在C#中自动转换为不同的数据类型。这称为隐式转换。
inti=345;floatf=i;Console.WriteLine(f);//输出:345
在上面的实例中,整型变量 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, ordecimal |
ushort | int,uint,long,ulong,float,double, ordecimal |
int | long,float,double, ordecimal. |
uint | long,ulong,float,double, ordecimal |
long | float,double, ordecimal |
ulong | float,double, ordecimal |
char | ushort,int,uint,long,ulong,float,double, ordecimal |
float | Double |
从int、uint、long或ulong转换为float以及从long或ulong转换为double可能会导致精度损失。没有数据类型隐式转换为char类型。
但是,并非所有数据类型都隐式转换为其他数据类型。例如,int类型不能隐式转换为uint。必须明确指定它,如下所示。
publicstaticvoidMain(){inti=100;uintu=(uint)i;Console.Write(i);}
在上面的示例中,整数i通过在括号(uint)中指定uint显式地转换为uint。这将把整数转换成uint。