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#包括一些预定义的值类型和引用类型。下表列出了预定义的数据类型:
类型 | 描述 | 范围 | 后缀 |
---|---|---|---|
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类型(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。