为什么我们不能做'if(对象)'在c#中测试对象是否为空

本文关键字:对象 测试 是否 不能 我们 if 为什么 | 更新日期: 2023-09-27 18:15:12

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

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

为什么c#中没有任何等价的东西允许我们做下面的事情?

if (object)

代替

if (object != null)

为什么我们不能做'if(对象)'在c#中测试对象是否为空

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

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

if (x = 5)
{ 
   // always true
}
所以,简而言之,没有包括它是为了有利于可读性和明确性。是的,它确实以轻微的代价来简洁,但是在减少意想不到的错误方面的收益比弥补了必须在括号内添加!= null的成本…

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

为什么c#中没有任何等价的东西允许我们做下面的事情?

要使用一个特性,必须首先是:

  • 指定
  • 批准
  • 测试

你提到的特性已经被考虑过了。它没有经过设计委员会的设计、指定或批准,没有经过开发团队的实施,没有经过测试,也没有在任何产品中发布。因此,您不能使用该功能。

如果这不能回答你的问题,那么问一个更好的问题。问为什么一种语言没有一个特性就像问为什么一个盒子是空的一样。每个空盒子都是空的,原因是一样的:因为里面没有。每个不可用的功能都是不可用的,因为它从未交付给客户,并且没有太多可说的。

从技术上讲,它不起作用,因为没有从自定义对象类到bool(布尔)的隐式转换。只要提供了隐式转换操作符(可以检查对象是否为null),就可以继续使用语法:

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

整合Dan Bryant的建议:

另一种方法是为数据类型实现隐式的"true"answers"false"操作符。如果您的类型允许对bool进行三状态求值:true、false和null,则可能需要这样做。这在数据库中很常见,其中null值表示缺失数据。以下是来自MSDN网页的示例:

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

因为语言设计者就是这样设计语言的。部分原因是为了防止一些愚蠢的错误,比如:

if (p = 42)

因为对象不是指针,所以它是对象。

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

如果你在c#中不以这种方式使用它的原因之后-从我的角度来看,以if(object)的方式检查null是完全不合逻辑的。

If object what?

你的例子看起来可读只是因为你的对象被命名为'object'。在现实中,对象的名称来源于它们的用途/功能。如果您的对象名为'validatedWidget',那么您的代码将看起来像

if (validatatedWidget)
{
    // do something
}

这将错误地暗示如下:

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

要明确得多,而且几乎不需要做很多工作。

if语句的语法为::

if(condition)

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

所以我们写任何条件,比如

x = 10;
if(x == 10)

,但是if(object)没有给出一个布尔值的特定条件。

如果我们写

 boolean object = true;
 if(object)

那么天气就会很好。

但是要查看某个对象是否为空,我们不能写if(object),我们需要写if(object == null)或if(object != null),因为这些条件将导致布尔结果