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#包括一些预定义的值类型和引用类型。下表列出了预定义的数据类型:
类型
|
描述
|
范围
|
后缀
|
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
|
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类型
预定义的数据类型为其.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,变量都相同。
int i = 345;
Int32 i = 345;// 同上
类型转换
某些数据类型的值会在C#中自动转换为不同的数据类型。这称为隐式转换。
int i = 345;
float f = 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, or decimal
|
ushort
|
int, uint, long, ulong, float, double, or decimal
|
int
|
long, float, double, or decimal.
|
uint
|
long, ulong, float, double, or decimal
|
long
|
float, double, or decimal
|
ulong
|
float, double, or decimal
|
char
|
ushort, int, uint, long, ulong, float, double, or 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。这将把整数转换成uint。