为什么我们不能做'if(对象)'在c#中测试对象是否为空
本文关键字:对象 测试 是否 不能 我们 if 为什么 | 更新日期: 2023-09-27 18:15:12
在C语言中,为了测试指针是否为空,我们可以这样做:
-
if (p != NULL)
-
if (p != 0)
-
if (p)
为什么c#中没有任何等价的东西允许我们做下面的事情?
if (object)
代替
if (object != null)
因为这种性质的测试可能会导致程序中出现意想不到的错误,因此他们倾向于要求布尔表达式是显式的(就像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),因为这些条件将导致布尔结果