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

Oti*_*iel 8 c c# null object

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

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

为什么在C#中没有任何等价物可以让我们做到以下几点?

if (object)
Run Code Online (Sandbox Code Playgroud)

代替

if (object != null)
Run Code Online (Sandbox Code Playgroud)

Jam*_*are 20

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

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

if (x = 5)
{ 
   // always true
}
Run Code Online (Sandbox Code Playgroud)

因此,简而言之,它不是为了有利于可读性和显性而被包含在内.是的,它确实付出了轻微的简洁成本,而且减少意外错误的涨幅更超过弥补hainvg成本加!= null括号内...

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

  • @sth:这是一个组合,x = 5是C中从`int`到`bool`的隐式转换,这是主要问题.请注意,您可以**在C#中的`if`语句中进行赋值,只要它们是`bool`赋值即可.比如,正如你所说,`if(launchMissles = true)`.如果最终结果是`bool`,它可以合法地用在表达式中.此外,只要评估是bool`,你就可以在`if`中进行赋值,例如`if((line = Console.ReadLine())!= null)` (2认同)

Eri*_*ert 14

为什么在C#中没有任何等价物可以让我们做到以下几点?

要使用功能必须首先:

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

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

如果这不能回答你的问题,那就问一个更好的问题.问一个语言为什么没有一个功能就像问为什么一个盒子是空的.由于同样的原因,每个空盒子都是空的:因为它里面没有任何东西.每个不可用的功能都不可用,因为它从未发送给客户,并且没有更多的说法.


Ale*_*kin 9

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

    public static implicit operator bool(MyType p)
    {
        return (p != null) && (p != 0);
    }
Run Code Online (Sandbox Code Playgroud)

整合Dan Bryant的建议:

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

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

public static bool operator false(DBBool x)
{
    return x.value < 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 此外,轻微狡辩,但您必须在该特定示例中命名参数@object,因为对象是保留字. (2认同)