1.数据类型类的层次结构
在这里,只需要理解处于类层次结构顶端的类型会为派生类型提供一些默认的行为。
注意,所有这些类型都派生自System.Object,它定义了一组.NET基类库中所有类型都具有的方法(ToString()、Equals()、GetHashCode()等,在第6章会详细介绍这些方法)。
还要注意,很多数值数据类型都派生自System.ValueType类。派生自ValueType的类型都会自动在栈上进行分配,因此有一个可预测的生命周期,而且非常高效。另一方面,在继承链上没有System.ValueType的类型(如System.Type、System.String、System.Array、System.Exception以及System.Delegate)不会在栈上分配,而是在垃圾回收堆上进行分配。
2.checked 和 unchecked关键字
C#提供了checked关键字,当我们把一个语句(或者语句块)包装在checked关键字域内时,C#编译器会使用额外的CIL指令来测试在将两个数值数据类型相加、相乘、相减和相除时可能产生的溢出情况。
如果发生了溢出,我们会得到一个运行时异常(准确地说是System.OverflowException)
// 这次,告诉编译器增加CIL代码,如果发生上溢或下溢就抛出异常。
try
{
byte sum = checked((byte)Add(b1, b2));
Console.WriteLine("sum = {0}", sum);
}
catch (OverflowException ex)
{
Console.WriteLine(ex.Message);
}
如果希望对一段代码语句块进行强制溢出检测,可以按如下所示定义checked域:
try
{
checked
{
byte sum = (byte)Add(b1, b2);
Console.WriteLine("sum = {0}", sum);
}
}
catch (OverflowException ex)
{
Console.WriteLine(ex.Message);
}
设定项目级别的溢出检测:
要使用Visual Studio 2008启用这个标志,可以打开项目属性页,然后点击Build选项卡中的Advanced按钮。在结果对话框中选择Check for arithmetic overflow/underflow(检测运算上溢/下溢)复选框