代码之家  ›  专栏  ›  技术社区  ›  Jace Rhea

为什么在检查对象是否等于空之前强制转换空值?

  •  12
  • Jace Rhea  · 技术社区  · 15 年前

    我在看 Domain Oriented N-Layered .NET 4.0 Sample App “项目并运行了一些我不理解的代码。在这个项目中,他们经常使用如下语法检查参数是否为空:

    public GenericRepository(IQueryableContext context,ITraceManager traceManager)
    {
        if (context == (IQueryableContext)null)
                throw new ArgumentNullException("context", Resources.Messages.exception_ContainerCannotBeNull);
    

    为什么要将空值强制转换为要检查空值的对象的类型?

    3 回复  |  直到 15 年前
        1
  •  14
  •   Josh    15 年前

    在给出的示例中,这是毫无意义的。

    虽然在这种情况下不适用,但有时需要强制转换空值(或者至少在添加默认值(t)之前就已经存在了)。考虑以下事项:

    void DoSomething(string x) {
        ...
    }
    
    void DoSomething(object x) {
        ...
    }
    
    DoSomething(null);            // compiler can't infer the type
    DoSomething((string)null);    // string type is now explicit
    DoSomething(default(string)); // same as previous
    

    编辑

    想想另一个例子,当你测试平等时,你必须做演员表。如果有一个对象的重载==运算符允许与两个引用类型进行比较,则与空进行比较将是不明确的。但是,由于iqueryableContext很可能是一个接口,并且接口不能重载==运算符,所以在您给出的示例中,我仍然没有看到任何有效的理由来执行它。

    class CustomObject {
    
        private string _id;
    
        public CustomObject(string id) {
            _id=id;
        }
    
        public static bool operator ==(CustomObject lhs, CustomObject rhs) {
            if (ReferenceEquals(lhs, rhs)) { return true; }
            if (ReferenceEquals(lhs, null)) { return false; }
            if (ReferenceEquals(rhs, null)) { return false; }
            return lhs._id == rhs._id;
        }
    
        public static bool operator !=(CustomObject lhs, CustomObject rhs) {
            return !(lhs == rhs);
        }
    
        public static bool operator ==(CustomObject lhs, string rhs) {
            if (ReferenceEquals(lhs, rhs)) { return true; }
            if (ReferenceEquals(lhs, null)) { return false; }
            if (ReferenceEquals(rhs, null)) { return false; }
            return lhs._id == rhs;
        }
    
        public static bool operator !=(CustomObject lhs, string rhs) {
            return !(lhs==rhs);
        }
    
    }
    
    CustomObject o = null;
    if (o == null) {
        Console.WriteLine("I don't compile.");
    }
    
        2
  •  6
  •   John Saunders    15 年前

    我不会演演员。在这种情况下没有理由这样做。

        3
  •  3
  •   Warty    15 年前

    在给定的示例中没有理由强制转换空值。可能是为了易读性…我不知道,我不会这么做的。

    在某些情况下(不包括本主题中介绍的情况),在检查变量是否为空之前,必须强制转换为inullable。否则,必须使用object==default(typeofobject)…