构建高质量的C#代码
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

代码 2-6:检查溢出(<checkedDemo>\Program.cs)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace checkedDemo
{
class Program
    {
    static void Main(string[] args)
    {
    int x=20000000;
        int y = 100000;
        int result = checked(x * y);
        Console.WriteLine(result);
    }
}
}

现在重新运行此代码,我们发现会提示OverflowException异常而无法继续执行。在实际开发中,我们可以使用try-catch代码结构来处理异常,对输入的操作数进行调整,以得到正确的计算结果。

像上面的例子,对于非常大的数值计算,我们还可以考虑使用decimal数据类型进行操作。

与checked运算符相对应的是unchecked运算符,这实现上是C#的默认操作,如代码2-5中所示的内容。以下两条语句的意义是一样的:

int result = x * y;
int result = unchecked(x * y);

既然是这样,那么unchecked运算符又有什么用呢?

unchecked运算符在进行可能发生溢出的数据类型转换操作时比较有用,这时如果只需要一个类型转换后的数据,而忽略原来类型的数值,也就是不计较转换后的数据值是否与原数据保持一致,就可以使用unchecked运算符来忽略溢出,而保证类型转换无条件完成。

此外,如果checked限制的是一个语句块,其中的某条语句不需要做溢出检查时,也可以使用unchecked运算符来指定,例如下面的代码。

int x = 0;
checked
{
unchecked
    {
    x=10000000*100000;
    }
}

使用checked和unchecked运算符可以检查整数的溢出操作,但并不意味其他数据类型就没有溢出的可能,在实际应用中,我们必须对各种数据类型的溢出,以及不同类型之间的转换非常小心,正确的数据往往比其他某些方面更重要。

下面给出checked和unchecked运算符的使用格式总结:

checked ( <表达式> );
checked { <语句块> }
unchecked ( <表达式> );
unchecked { <语句块> }

2.2.3 ++与--运算

用过C或C++的读者,可能对这两种运算比较熟悉。现在,我们就看看它们在C#中的应用,与其他语言一样,C#中的++(增量运算)和--(减量运算)也分为前运算和后运算两种情况,如i++和++i,它们的区别是什么呢?我们通过代码2-7来看一看。