c# – 什么时候应该防范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");
 }

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...