加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读