C# 关键字abstract event new structas explicit null switch base extern object thisbool false operator throw break finally out truebyte fixed override trycase float params typeof catch for private uintchar foreach protected ulong checked goto public unchecked class if readonly unsafe const implicit ref ushort continue in return using decimal int sbyte virtual default interface sealed volatile delegate internal short voiddo is sizeof while double lock stackallocelse long staticenum namespace string类型(C# 参考)更新:2007 年11 月C# 类型体系包含下列几种类别:∙值类型∙引用类型∙指针类型值类型的变量存储数据,而引用类型的变量存储对实际数据的引用。
引用类型也称为对象。
指针类型仅可用于unsafe模式。
通过装箱和取消装箱,可以将值类型转换为引用类型,然后再转换回值类型。
除了装箱值类型外,无法将引用类型转换为值类型。
本节还介绍void类型。
值类型也可以为null,这意味着它们能存储其他非值状态。
有关更多信息,请参见可以为null 的类型。
值类型(C# 参考)值类型主要由两类组成:∙结构∙枚举结构分为以下几类:∙Numeric(数值)类型o整型o浮点型o decimal∙bool∙用户定义的结构。
值类型的主要功能基于值类型的变量直接包含值。
将一个值类型变量赋给另一个值类型变量时,将复制包含的值。
这与引用类型变量的赋值不同,引用类型变量的赋值只复制对对象的引用,而不复制对象本身。
所有的值类型均隐式派生自System.ValueType。
与引用类型不同,可以从值类型派生出新的类型。
但与引用类型相同的是,结构也可以实现接口。
与引用类型不同,值类型无法包含null 值。
然而,可译为null 的类型功能确实允许将null 赋给值类型。
每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。
有关值类型的默认值的信息,请参见默认值表。
简单类型的主要功能所有的简单类型(C# 语言的组成部分)均为 .NET Framework 系统类型的别名。
例如,int是System.Int32的别名。
有关完整的别名列表,请参见内置类型表(C# 参考)。
编译时计算操作数均为简单类型常数的常数表达式。
可使用文字初始化简单类型。
例如,“A”是char 类型的文字,而2001 是int 类型的文字。
初始化值类型在使用C# 中的局部变量之前,必须对其进行初始化。
例如,可能声明未进行初始化的局部变量,如以下示例所示:复制int myInt;那么在将其初始化之前,无法使用此变量。
可使用下列语句将其初始化:复制myInt = new int(); // Invoke default constructor for int type.此语句是下列语句的等效语句:复制myInt = 0; // Assign an initial value, 0 in this example.当然,可以用同一个语句进行声明和初始化,如下面示例所示:复制int myInt = new int();- 或-复制int myInt = 0;使用new运算符时,将调用特定类型的默认构造函数并对变量赋以默认值。
在上例中,默认构造函数将值0 赋给了myInt。
有关通过调用默认构造函数所赋的值的更多信息,请参见默认值表。
对于用户定义的类型,使用new来调用默认构造函数。
例如,下列语句调用了Point 结构的默认构造函数:复制Point p = new Point(); // Invoke default constructor for the struct. 此调用后,该结构被认为已被明确赋值;也就是说该结构的所有成员均已初始化为各自的默认值。
有关new 运算符的更多信息,请参见new。
有关格式化数字类型输出的信息,请参见格式化数值结果表。
struct(C# 参考)struct 类型是一种值类型,通常用来封装小型相关变量组,例如,矩形的坐标或库存商品的特征。
下面的示例显示了一个简单的结构声明。
enum(C# 参考)enum 关键字用于声明枚举,即一种由一组称为枚举数列表的命名常量组成的独特类型。
通常情况下,最好是在命名空间内直接定义枚举,以便该命名空间中的所有类都能够同样方便地访问它。
但是,还可以将枚举嵌套在类或结构中。
默认情况下,第一个枚举数的值为0,后面每个枚举数的值依次递增1。
整型表(C# 参考)更新:2007 年11 月下表显示了整型的大小和范围,这些类型构成了简单类型的一个子集。
如果整数表示的值超出了ulong 的范围,将产生编译错误。
浮点型表(C# 参考)更新:2007 年11 月下表显示了浮点型的精度和大致范围。
decimal(C# 参考)更新:2007 年11 月decimal 关键字表示128 位数据类型。
同浮点型相比,decimal 类型具有更高的精度和更小的范围,这使它适合于财务和货币计算。
decimal 类型的大致范围和精度如下表所示。
文本如果希望实数被视为decimal 类型,请使用后缀m 或M,例如:复制decimal myMoney = 300.5m;如果没有后缀m,数字将被视为double类型,从而导致编译器错误。
转换整型被隐式转换为decimal,其计算结果为decimal。
因此,可以用整数初始化十进制变量而不使用后缀,如下所示:复制decimal myMoney = 300;在浮点型和decimal 类型之间不存在隐式转换;因此,必须使用强制转换在这两种类型之间进行转换。
例如:复制decimal myMoney = 99.9m;double x = (double)myMoney;myMoney = (decimal)x;还可以在同一表达式中混合使用decimal 和数值整型。
但是,不进行强制转换就混合使用decimal 和浮点型将导致编译错误。
有关隐式数值转换的更多信息,请参见隐式数值转换表(C# 参考)。
有关显式数值转换的更多信息,请参见显式数值转换表(C# 参考)。
格式化十进制输出可以通过使用String.Format 方法或Console.Write方法(它调用String.Format())来格式化结果。
货币格式是使用标准货币格式字符串“C”或“c”指定的,如本文后面的第二个示例所示。
有关String.Format 方法的更多信息,请参见String.Format。
示例在此例中,同一个表达式中混合使用了decimal 和int。
计算结果为decimal 类型。
下面的示例使用某个语句来尝试添加double和decimal 变量:double x = 9;Console.WriteLine(d + x); // Error其结果是导致以下错误:Operator '+' cannot be applied to operands of type 'double' and 'decimal'public class TestDecimal{static void Main(){decimal d = 9.1m;int y = 3;Console.WriteLine(d + y); // Result converted to decimal}}// Output: 12.1在此例中,使用了货币格式字符串来设置输出格式。
注意:其中x 被舍入,因为其小数点位置超出了$0.99。
而表示最大精确位数的变量y 严格按照正确的格式显示。
public class TestDecimalFormat{static void Main(){decimal x = 0.999m;decimal y = 9999999999999999999999999999m;Console.WriteLine("My amount = {0:C}", x);Console.WriteLine("Your amount = {0:C}", y);}}/* Output:My amount = $1.00Your amount = $9,999,999,999,999,999,999,999,999,999.00*/bool(C# 参考)更新:2007 年11 月bool 关键字是System.Boolean的别名。
它用于声明变量来存储布尔值true和false。
说明:文本可将布尔值赋给bool 变量。
也可以将计算为bool 类型的表达式赋给bool 变量。
public class BoolTest{static void Main(){bool b = true;// WriteLine automatically converts the value of b to text.Console.WriteLine(b);int days = DateTime.Now.DayOfYear;// Assign the result of a boolean expression to b.b = (days % 2 == 0);if (true == b){Console.WriteLine("days is an even number");}else{Console.WriteLine("days is an odd number");}}}/* Output:Truedays is an <even/odd> number*/转换在C++ 中,bool 类型的值可转换为int 类型的值;也就是说,false 等效于零值,而true 等效于非零值。
在C# 中,不存在bool 类型与其他类型之间的相互转换。
例如,下面的if 语句在C# 中无效:int x = 123;// if (x) // Error: "Cannot implicitly convert type 'int' to 'bool' "{Console.Write("The value of x is nonzero.");}若要测试int 类型的变量,必须将该变量与一个值(例如零)进行显式比较,如下所示:if (x != 0) // The C# way{Console.Write("The value of x is nonzero.");}示例在此例中,您从键盘输入一个字符,然后程序检查输入的字符是否是一个字母。