为什么我们不能在C#中“if(object)”来测试object是否为null?

时间:2011-11-17 15:29:17

标签: c# c object null

在C中,为了测试指针是否为空,我们可以这样做:

  • if (p != NULL)
  • if (p != 0)
  • if (p)

为什么C#中不存在允许我们执行以下操作的等效内容?

if (object)

而不是

if (object != null)

8 个答案:

答案 0 :(得分:20)

因为这种性质的测试可能会导致程序中出现意外错误,因此他们倾向于要求布尔表达式是显式的(就像Java一样),而不是执行隐式转换为bool

这也是为什么你不能在C#中使用int作为布尔表达式的原因。由于唯一有效的布尔表达式是直接求值为bool的表达式,因此可以防止在代码中引入意外错误,例如旧的C问题:

if (x = 5)
{ 
   // always true
}

因此,简而言之,它不是为了支持可读性和显性而被包含在内。是的,它确实以简单的轻微成本,但减少意外错误更多的收益比弥补hainvg添加!= null的成本更多在括号内......

(当然,您可以创建自定义类型到bool的隐式转换,作为解决方法,但不能将其全局应用于任何对象类型)

答案 1 :(得分:14)

  

为什么C#中不存在允许我们执行以下操作的等效内容?

要使用某项功能必须首先:

  • 想到
  • 设计
  • 指定
  • 批准
  • 实施
  • 测试

您提到的功能已被考虑过。它尚未由设计委员会设计,指定或批准,尚未由开发团队实施,尚未经过测试,并且从未在任何产品中发货。因此,您无法使用该功能。

如果这不能回答您的问题,那么提出更好的问题。询问为什么语言没有功能就像问为什么一个盒子是空的。由于同样的原因,每个空框都是空的:因为其中没有任何内容。每个不可用的功能都不可用,因为它从未发送给客户,而且没有更多的话要说。

答案 2 :(得分:9)

从技术上讲,它不起作用,因为从自定义对象类到bool(布尔值)没有implicit conversion可能。只要你提供了一个隐式转换运算符,它可能会检查你的对象为null,你可以继续使用你的语法:

    public static implicit operator bool(MyType p)
    {
        return (p != null) && (p != 0);
    }

整合Dan Bryant的建议:

另一种方法是为您的数据类型实现隐式“true”和“false”运算符。如果您的类型允许对bool进行三态评估,则可能需要此项:true,false和null。这在数据库中非常常见,其中空值指定缺少的数据。以下是MSDN webpage

中的示例
public static bool operator true(DBBool x)
{
    return x.value > 0;
}

public static bool operator false(DBBool x)
{
    return x.value < 0;
}

答案 3 :(得分:4)

因为语言设计师就是这样设计语言的。部分是为了防止像:

这样的愚蠢错误
if (p = 42)

答案 4 :(得分:3)

因为Object不是指针,所以它是一个Object。

答案 5 :(得分:2)

因为它不在C#规范中,并且编译器不理解这样的表达式。

如果你是因为在C#中没有以这种方式使用它的原因 - 从我的观点来看,如果(对象)以某种方式检查某些东西是完全不合逻辑的。

如果对象是什么?

答案 6 :(得分:1)

您的示例看起来只是因为您的对象名为'object'。实际上,对象具有源自其使用/功能的名称。如果您的对象被称为'validatedWidget',那么您的代码将看起来像

if (validatatedWidget)
{
    // do something
}

哪会错误地暗示某些地方:

if (validatedWidget != null)
{
   // do something
}

更明确,并且几乎没有很多工作。

答案 7 :(得分:0)

if语句的语法是::

if(condition)

并且条件的结果应该是布尔值,即真或假。

所以我们写了像

这样的条件
x = 10;
if(x == 10)

但是如果(object)没有使特定条件成为布尔结果。

如果我们写

 boolean object = true;
 if(object)

然后它会完全没问题。

但是为了查看是否有任何对象是null我们不能写if(object)我们需要把它写成if(object == null)或if(object!= null),因为这样的条件会导致布尔结果。