c# – 什么时候应该防范null?

前端之家收集整理的这篇文章主要介绍了c# – 什么时候应该防范null?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
什么时候应该防范空论证?理想情况下,我会防范无处不在,但是却变得非常blo肿和乏味.我也注意到,人们并没有把守卫放在像AsyncCallbacks这样的东西上.

为了避免烦人的别人有很多单一的代码,有什么可接受的标准,我应该在哪里防范null?

谢谢.

解决方法

我使用的一个方法null object pattern.
例如,如果一个工厂类基于参数返回接口的不同实现,并且所提供的参数未映射到任何实现,我将返回一个NullObject,
例如
  1. public interface IFoo{
  2. void Bar();
  3. }
  4. public class NullFoo{
  5. public void Bar(){
  6. //null behavIoUr
  7. }
  8. }
  9. public class FooFactory{
  10. public IFoo CreateFoo(int i){
  11. switch(i){
  12. case 1:
  13. return new OneFoo();
  14. break;
  15. case 2:
  16. return new TwoFoo();
  17. break;
  18. default:
  19. return new NullFoo();
  20. break;
  21. }
  22. }
  23. }

当我想从CreateFoo获取一个IFoo时,我不必检查返回的对象是否为空.

显然,这只是众多方法之一.没有“一刀切”,因为null可以意味着不同的东西.

另一种防止空参数的方法是使用CodeContract preconditions.
例如

  1. public void Foo(Bar x){
  2. Contract.Requires<ArgumentNullException>( x != null,"x" );
  3. //access x
  4. }

使用代码合同允许您针对代码运行静态代码分析并捕获诸如Foo(null)之类的错误. (more here)

还有一个为什么要这么做的是使用一个非常简单的通用扩展方法

  1. public static class Ex
  2. {
  3. public static void EnsureNotNull<T>(this T t,string argName) where T:class
  4. {
  5. if(t == null)
  6. {
  7. throw new ArgumentNullException(argName);
  8. }
  9. }
  10. }

那么你可以检查这样的参数:

  1. public void Foo(Bar x,Bar y){
  2. x.EnsureNotNull("x");
  3. y.EnsureNotNull("y");
  4. }

猜你在找的C#相关文章