C#:与null比较

时间:2009-02-27 04:51:39

标签: c# null

这些是等效的吗?

if (null==myobject)
{
//do something 
}

if (myobject==null)
{
//do something 
}

或者他们会生成不同的代码吗?

5 个答案:

答案 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)

正如其他人所指出的,他们大多是等同的。

您还应该看看: http://en.wikipedia.org/wiki/Null_Object_pattern

这是一个非常有用的替代方法,只需检查空引用。