练习

(1)“使用 Trace.WriteLine() 要优于使用 Debug.WriteLine(),因为调试版本仅能用于调试程序。” 这个观点正确吗?为什么?

答案:  这个语句仅要用于所有版本的信息有效。而且,我们常常希望仅在使用调试版本时输出调试信息。此时应首选Debug.WriteLine()版本。

(2)为一个简单的应用程序编写代码,其中包含一个循环,该循环在运行 5000 次后产生一个错误。使用断点在第 5000 次循环出现错误前进入中断模式(注意产生错误的一种简单方式是视图访问一个不存在的数组元素,例如在一个有 100 个元素的数组中,访问 myArray[1000])。

答案:

  1. 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中,可以把断点方在下面的代码行上:

  1. Console.WriteLine("Loop cycle {0}", i);


  应修改断点的属性,把执行次数的条件设置为“执行次数等于5000时中断”。

(3)“只有在不执行 catch 块的情况下,才执行 finally 代码块”,对吗?

答案:错误,finally块始终会执行,它可能在处理catch块之后执行。

(4)下面定义了一个枚举数据类型 orientation。编写一个应用程序,使用结构化异常处理(SEH)将 byte 类型的变量安全地强制转换为 orientation 类型变量。注意,可使用 checked 关键字强制抛出异常,下面是一个示例。在你编写的应用程序中应该使用这段代码:

  1. enum Orientation : byte
  2. {
  3. North = 1,
  4. South = 2,
  5. East = 3,
  6. West = 4
  7. }
  8. myDirection = checked((Orientation)myByte);
答案:

  1. 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值,即使在枚举中没有为该值指定名称也同样如此。在上面的代码中,如有必要,可以生成自己的异常。