if (p != NULL)
if (p != 0)
if (p)
if (object)
代替
if (object != null)
因为这种测试可能导致程序中出现意外的错误,因此他们更喜欢要求布尔表达式明确 (就像 Java 一样),而不是执行 bool
的隐式转换。
这也是为什么你不能在 C# 中使用 int
作为布尔表达式的原因。由于唯一有效的布尔表达式是直接求值为 bool
的表达式,这可防止代码中出现意外的错误,例如旧 C 语言陷阱所示:
if (x = 5)
{
// always true
}
简而言之,这并不是为了支持可读性和明确性而被包含的。是的,在简洁性方面它会有一些轻微的代价,但是减少意外错误的收益远远超过必须在括号内添加!= null
的代价...
(当然,你可以创建一个自定义类型到bool
的隐式转换作为解决方法,但是你无法将其全局应用于任何对象类型)
if (x = 5)
和这个问题没有任何关系,是吗?这个错误与在那个位置允许赋值有关,与 null
是否可以隐式转换为 false
没有任何关系... 或者 C# 允许在那个位置进行赋值,所以 if (launchMissiles = true) ...
将编译并且会出现可怕的错误吗? - sthint
到bool
的隐式转换,这是主要问题。请注意,在C#中,你可以在if
语句中进行赋值操作,只要它们是bool
类型的赋值。就像你说的那样,if (launchMissles = true)
。如果最终结果是一个bool
类型,它可以合法地用于表达式中。此外,只要评估结果是bool
类型,你也可以在if
语句中进行赋值操作,比如if ((line = Console.ReadLine()) != null)
。 - James Michael Hareif
中发生意外的布尔赋值,但这种情况很少见,因为我们通常不说== true
或== false
,而是可以直接省略并测试表达式本身。 - James Michael Hareif (launchMissiles = true)
会给你一个警告。微软不想为核战争负责。 - configuratorformat c:
应该确保你真的想这么做…” - James Michael Hare public static implicit operator bool(MyType p)
{
return (p != null) && (p != 0);
}
根据Dan Bryant的建议整合:
另一种方法是为您的数据类型实现隐式的“true”和“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)
if (p = null)
,那是因为你想要写成 if (p == null)
或者 if (p != null)
。写成 if (p)
才可以避免愚蠢的错误。 - Otiel因为一个对象不是指针,而是一个对象。
你的示例代码看起来只是因为你的对象被命名为“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),因为这样的条件将产生布尔结果。
if (object != null)
比if (object)
更易读且更具描述性。 - PolynomialC# == C
?仅仅因为C有某个语言特性,并不意味着C#也应该拥有它。 - Oded