这些是等效的吗?
if (null==myobject)
{
//do something
}
和
if (myobject==null)
{
//do something
}
或者他们会生成不同的代码吗?
答案 0 :(得分:41)
在99%的情况下,此代码是等效的。
一个例外是当有问题的对象的类型覆盖==运算符时。可能会在==中引入一个错误,当一个参数为null时会导致问题。
我之前见过的一个特例是以下
public static bool operator==(Student left, Student right) {
return left.Equals(right);
}
当null在左侧时,这将失败,但在右侧为null时可能不会。
这是一个相当遥远的案例。
答案 1 :(得分:9)
将常量放在左边的“if
”语句的形式是C / C ++的延续,你可以在if语句中使用任意表达式。
if语句的C#语法要求表达式求值为bool,这意味着if (foo = 0)
将无法编译。
答案 2 :(得分:6)
if (null==myobject) {
是一种编写if语句的安全方法。它来自C / C ++,其中条件是评估为int
的表达式。如果结果为零意味着false
,则其他任何内容都为true
。你可以写点像
if (variable == 1) {
但是如果你不小心你也可以写
if (variable = 1) {
在这种情况下,您的赋值总是计算为1,因此始终为true。
你可以编译它并运行它没有任何问题,但结果将不是你所期望的。所以C / C ++程序员开始编写像
这样的东西if (1 == variable) {
如果拼错它,这将无法编译,所以你总是必须按照你的意思来编写它。这后来成为一种(良好)习惯,你可以在你编程的所有语言中使用它,例如C#。
答案 3 :(得分:3)
对于那些想念它的人来说,如果你想减少混乱,也可以为C-language
类启用C#
- 样式空检查:
class MyObj
{
public void implicit_null_comparison_demo()
{
MyObj mo = null;
// ...
if (mo) // <-- like so (can also use !mo)
{
// it's not null...
}
else
{
// it's null...
}
}
public static implicit operator bool(MyObj mo)
{
return (Object)mo != null;
}
};
答案 4 :(得分:2)