c# – 什么时候应该防范null?
发布时间:2020-12-15 06:25:15 所属栏目:百科 来源:网络整理
导读:什么时候应该防范空论证?理想情况下,我会防范无处不在,但是却变得非常blo肿和乏味.我也注意到,人们并没有把守卫放在像AsyncCallbacks这样的东西上. 为了避免烦人的别人有很多单一的代码,有什么可接受的标准,我应该在哪里防范null? 谢谢. 解决方法 我使用的
什么时候应该防范空论证?理想情况下,我会防范无处不在,但是却变得非常blo肿和乏味.我也注意到,人们并没有把守卫放在像AsyncCallbacks这样的东西上.
为了避免烦人的别人有很多单一的代码,有什么可接受的标准,我应该在哪里防范null? 谢谢. 解决方法
我使用的一个方法是
null object pattern.
例如,如果一个工厂类基于参数返回接口的不同实现,并且所提供的参数未映射到任何实现,我将返回一个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"); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |