练习
(1)“使用 Trace.WriteLine() 要优于使用 Debug.WriteLine(),因为调试版本仅能用于调试程序。” 这个观点正确吗?为什么?
答案: 这个语句仅要用于所有版本的信息有效。而且,我们常常希望仅在使用调试版本时输出调试信息。此时应首选Debug.WriteLine()版本。
(2)为一个简单的应用程序编写代码,其中包含一个循环,该循环在运行 5000 次后产生一个错误。使用断点在第 5000 次循环出现错误前进入中断模式(注意产生错误的一种简单方式是视图访问一个不存在的数组元素,例如在一个有 100 个元素的数组中,访问 myArray[1000])。
答案:
static void Main(string[] args)
{
for(int i = 1; i < 10000; i++)
{
Console.WriteLine("Loop cycle {0}", i);
if(i == 5000)
{
Console.WriteLine(args[999]);
}
}
}
在VS中,可以把断点方在下面的代码行上:
Console.WriteLine("Loop cycle {0}", i);
应修改断点的属性,把执行次数的条件设置为“执行次数等于5000时中断”。
(3)“只有在不执行 catch 块的情况下,才执行 finally 代码块”,对吗?
答案:错误,finally块始终会执行,它可能在处理catch块之后执行。
(4)下面定义了一个枚举数据类型 orientation。编写一个应用程序,使用结构化异常处理(SEH)将 byte 类型的变量安全地强制转换为 orientation 类型变量。注意,可使用 checked 关键字强制抛出异常,下面是一个示例。在你编写的应用程序中应该使用这段代码:
enum Orientation : byte
{
North = 1,
South = 2,
East = 3,
West = 4
}
myDirection = checked((Orientation)myByte);
答案:
static void Main(string[] args)
{
Orientation myDirection;
for(byte myByte = 2; myByte < 10; myByte++)
{
try
{
myDirection = checkd((Orientation)myByte);
if((myDirection < Orientation.North) || (myDirection > Orientation.West))
{
throw new ArgumentOutOfRangeException("myByte", myByte, "Value must be between 1 and 4");
}
}
cath(ArgumentOutOfRangeException e)
{
// If this section is reached then myByte < 1 or myByte > 4.
Console.WriteLine("e.Message");
Console.WriteLine("Assigning default value, Orientation.North.");
myDirection = Orientation.North;
}
Console.WriteLine("myDirection = {0}", myDirection);
}
}
注意这是一个小问题。因为枚举基于byte类型,所以可以给其赋予任意byte值,即使在枚举中没有为该值指定名称也同样如此。在上面的代码中,如有必要,可以生成自己的异常。