什么时候应该防范空论证?理想情况下,我会防范无处不在,但是却变得非常blo肿和乏味.我也注意到,人们并没有把守卫放在像AsyncCallbacks这样的东西上.
为了避免烦人的别人有很多单一的代码,有什么可接受的标准,我应该在哪里防范null?
谢谢.
解决方法
我使用的一个方法是
null object pattern.
例如,如果一个工厂类基于参数返回接口的不同实现,并且所提供的参数未映射到任何实现,我将返回一个NullObject,
例如
例如,如果一个工厂类基于参数返回接口的不同实现,并且所提供的参数未映射到任何实现,我将返回一个NullObject,
例如
- public interface IFoo{
- void Bar();
- }
- public class NullFoo{
- public void Bar(){
- //null behavIoUr
- }
- }
- public class FooFactory{
- public IFoo CreateFoo(int i){
- switch(i){
- case 1:
- return new OneFoo();
- break;
- case 2:
- return new TwoFoo();
- break;
- default:
- return new NullFoo();
- break;
- }
- }
- }
当我想从CreateFoo获取一个IFoo时,我不必检查返回的对象是否为空.
显然,这只是众多方法之一.没有“一刀切”,因为null可以意味着不同的东西.
另一种防止空参数的方法是使用CodeContract preconditions.
例如
- public void Foo(Bar x){
- Contract.Requires<ArgumentNullException>( x != null,"x" );
- //access x
- }
使用代码合同允许您针对代码运行静态代码分析并捕获诸如Foo(null)之类的错误. (more here)
还有一个为什么要这么做的是使用一个非常简单的通用扩展方法:
- public static class Ex
- {
- public static void EnsureNotNull<T>(this T t,string argName) where T:class
- {
- if(t == null)
- {
- throw new ArgumentNullException(argName);
- }
- }
- }
那么你可以检查这样的参数:
- public void Foo(Bar x,Bar y){
- x.EnsureNotNull("x");
- y.EnsureNotNull("y");
- }