1)如何在。NET下使用断言
在。NET下,有两个类提供了Assert()方法,一个是Debug,一个是Trace,他们都位于System.Diagnostics命名空间下面
他们的区别:
一般得到的回答是,在调试阶段使用Debug,在Release阶段使用Trace,因为Debug在release版本中会失效?真的么?在Release版本中真的不能使用Debug.Assert()么?
a)也是。也不是。
b)为什么说是,是从设计角度,从其不同的作为范围来说的。为什么要设计两个呢,就是为了要区分出来,一个在Debug模式下用,一个在Release下用,那么为什么非要在Release下用Debug呢。所以,从这个角度来说,在Release下是不能用Debug的。
c)为什么说不是,是从技术的角度来说的。在Release下面是完全可以使用Debug.Assert()的。
其实,真正控制Debug和Trace是否失效的,不是Debug版本还是Release版本,而是其背后的宏定义。用VS编写工程时,在Debug版本下,默认的声明了两个定义 Debug和Trace, 在Release版本下,只声明了一个定义Trace,所以在Release下Debug就失效了。 你可以任意组合这两个开关,这样就能在任意模式下使用你想使用的任意类型。 比如,你可以在Release模式下打开Debug的开关。完全可以。
除了这个方法,也可以在文件中显示的声明宏定义。格式如下:
#define DEBUG
#define TRACE
需要注意一点: 在哪个文件中使用了Assert,必须在哪个文件中包含上述的宏定义,而且宏定义必须放在文件的最开始位置,即在引用命名空间之前,否则会出编译错误。当有多个不同的文件时,必须在多个不同的文件中同时声明,否则不起作用。注意,这里说的是文件,而不是类。 一个文件中可能包含多个不同的类,这没有关系。宏定义可以在一个文件的不同类间共享,但不可在不同文件中共享。
2)什么时候使用断言,什么时候使用异常处理
上述只是说明怎么使用断言,但究竟在什么场景下使用,就是另一个问题了。
一般的理解是:如果你进行了异常捕获,但不能给出一个有效的处理方式,也即是说这种异常的捕获没有意义,这时候就应该使用断言,否则,就该使用异常。
代码大全的建议: 在永远不可能出错的地方使用断言,在其他的地方,使用异常
其他两个相关的文章:
http://msdn.microsoft.com/en-us/library/ttcc4x86(VS.71).aspx
http://www.codeproject.com/KB/trace/debugtreatise.aspx