在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,作为变通方法,但不能将其全局应用于任何对象类型)
Eri*_*ert 14
为什么在C#中没有任何等价物可以让我们做到以下几点?
要使用功能必须首先:
您提到的功能已被考虑过.它尚未由设计委员会设计,指定或批准,尚未由开发团队实施,尚未经过测试,并且从未在任何产品中发货.因此,您无法使用该功能.
如果这不能回答你的问题,那就问一个更好的问题.问一个语言为什么没有一个功能就像问为什么一个盒子是空的.由于同样的原因,每个空盒子都是空的:因为它里面没有任何东西.每个不可用的功能都不可用,因为它从未发送给客户,并且没有更多的说法.
从技术上讲,它不起作用,因为没有从自定义对象类到(布尔值)的隐式转换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)