关于检查空值的问题

时间:2010-08-05 18:36:25

标签: c# .net

我和我的一位同事讨论了检查空值的问题。

他认为“在某些情况下”下面的代码会给他一个空值例外:

string test = null;
if(test == null) //error here
{

}

但如果将代码更改为此,则不会出现错误:

string test = null;
if(null == test) //NO error here
{

}

我告诉他这不可能发生,但他发誓修复了他的代码。上述更改是否可能导致错误?

4 个答案:

答案 0 :(得分:12)

不是字符串,不是。你可以通过写得不好的==重载来实现:

using System;

public class NaughtyType
{
    public override int GetHashCode()
    {
        return 0;
    }

    public override bool Equals(object other)
    {
        return true;
    }

    public static bool operator ==(NaughtyType first, NaughtyType second)
    {
        return first.Equals(second);
    }

    public static bool operator !=(NaughtyType first, NaughtyType second)
    {
        return !first.Equals(second);
    }
}

public class Test
{    
    static void Main()
    {
        NaughtyType nt = null;
        if (nt == null)
        {
            Console.WriteLine("Hmm...");
        }
    }
}

当然,如果您将等于运算符更改为:

public static bool operator ==(NaughtyType first, NaughtyType second)
{
    return second.Equals(first);
}

然后你的同事代码会失败,但是你的代码不会!基本上,如果您正确地重载运算符 - 或使用不重载运算符的类型 - 这不是问题。如果你的同事一直声称他遇到了它,请让他重现它。他当然不应该要求你根据他无法展示的东西来降低可读性(我相信大多数人会发现第一种形式更具可读性)。

答案 1 :(得分:6)

我认为这是C / C ++中“最佳实践”的遗留问题,因为使用'='代替'=='是一个容易犯的错误:

if(test = null)  // C compiler Warns, but evaluates always to false

if(null = test)  // C compiler error, null cannot be assigned to 

在C#中,它们都会产生错误。

答案 2 :(得分:2)

你是对的。如果他可以在没有重载==运算符的情况下重现这一点,请邀请他在此处发布。

答案 3 :(得分:1)

如果test是一个字符串,if (test == null)的测试是有效的,永远不会给出异常。两项测试基本上完全相同。