微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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");
 }

原文地址:https://www.jb51.cc/csharp/95663.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐