C# - 为什么对象类没有真正的运算符?

时间:2016-11-01 04:18:58

标签: c# operators

很抱歉,如果我的问题看起来很愚蠢。

在C ++中,这段代码可以工作:

SELECT AVG(t1.x)
FROM table t1, table t2
GROUP BY t1.x
HAVING SUM(SIGN(t1.x - t2.x)) = 0

在C#中,这不起作用:

Foo* foo = new Foo();
if (foo)
    ....;
else
    ....;

因为Object obj = new Object(); if (obj) ....; else ....; 类无法隐式转换为Object(显而易见,没有问题),并且它不会实现bool运算符。

所以我的问题是为什么没有true实现Object运算符(只是检查它本身是否为空,听起来很容易)?是因为代码可读性还是其他原因?

3 个答案:

答案 0 :(得分:6)

您问题的基本答案是在接受的答案中给出的答案:因为C#旨在避免,而不是永久 C的设计错误。

但更具体地说:你问为什么类型没有实现operator true。该问题的答案是:operator true目的是实现短路&&||运算符。由于不希望object实施&&&|||,因此没有理由实施operator trueoperator false

答案 1 :(得分:5)

这是因为代码清晰。 C#的许多设计选择都是以这样的目标为代码编写的,这样就可以立即明白它正在尝试做什么。如果你有类似的东西:

Object obj = ...;
if (obj)
     ....

if(obj)是什么意思?是否检查obj是否为真?是在检查它是null吗?是在检查它是0吗?有人不清楚看到代码,并且需要程序员查阅C#文档以了解这个特定语法正在做什么。所以相反,C#让你说

Object obj = ...;
if (obj == null)
    ....

这样,很明显你要做的是什么。

这就是为什么C#要求您实例化局部变量以及在代码中使用它们之前声明它们的原因。未实例化变量的值是不明确的,并且取决于编译器的配置,因此C#不是强迫您进行研究或进行猜测,而是使其成为必须以您的意图明确的方式编写代码。

答案 2 :(得分:1)

拳击。

当价值被加框时,涉及布尔值的条件非常容易让人感到困惑。

你想要什么:

object o = false; // Yes, this is legal, it makes a boxed System.Boolean
if (o) { ... }

由于这个原因,在类似条件下测试类似bool的类型是好的,但对于System.Object来说不是这样,它是所有盒装值的基类。