在C中,为了测试指针是否为空,我们可以这样做:
if (p != NULL)
if (p != 0)
if (p)
为什么C#中不存在允许我们执行以下操作的等效内容?
if (object)
而不是
if (object != null)
答案 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),因为这样的条件会导致布尔结果。