什么时候应该防范空论证?理想情况下,我会防范无处不在,但是却变得非常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"); }