检查空值的问题

3

我刚刚和我的一位同事就检查 null 值的问题进行了辩论。

他坚称在 "某些情况" 下,下面的代码会导致 null 值异常:

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

}

但是如果将代码更改为以下内容,则不会出现错误:

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

}

我告诉他这不可能发生,但他发誓这样修复了他的代码。是否存在任何可能的情况,上述更改可以修复错误?

相关内容:https://dev59.com/M0jSa4cB1Zd3GeqPI9qb - Brian Rasmussen
不可交换的相等?令人害怕。 - Marc
4个回答

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);
}

那么你同事的代码将会失败,但你的不会!基本上,如果你适当地重载运算符 - 或者使用不重载运算符的类型 - 这就不是一个问题。如果你的同事一直声称他遇到了这个问题,那就要求他再现它。他肯定不应该要求你基于他不能证明的事情来降低可读性(我相信大多数人认为第一种形式更易读)。


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#中,它们都会产生错误。

1
即使编程多年,那些愚蠢的 C/C++ 代码中的错误仍然会抓住我。但是在 C# 中不会发生这种情况 :=) - Justin
2
是的,我怀疑有人声称“编码错误”来推广他的编码偏好。 - Joel Rondeau

2

你说得对。如果他可以在没有重载==运算符的情况下复现这个问题,那就邀请他在这里发布。


是的,这就是人们在C++(以及可能其他语言)中学习编程的方式,因为你可以在if测试表达式中分配变量。在C#中,你不能轻松地在if测试表达式中分配变量,因此这种风格是不必要的。 - Matt Ellen

1

如果test是一个字符串,那么if (test == null)的测试是有效的,并且永远不会引发异常。这两个测试本质上也完全相同。


确实,否则 string.IsNullOrEmpty() 也会崩溃,这是不可能发生的。 - Michael Stum
@Michael:嗯,string.IsNullOrEmpty 可以使用 object.ReferenceEquals 进行实现。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接