【问题标题】:Testing for null reference always returns false... even when null测试空引用总是返回假...即使是空的
【发布时间】:2012-02-05 14:29:46
【问题描述】:

如果我使用 Visual C# 2010 编译以下代码 sn-p,我 总是 得到错误:

object o = null;
Console.WriteLine("Is null: " + o == null); // returns false

有人知道为什么吗???

【问题讨论】:

    标签: c# .net operator-precedence


    【解决方案1】:

    运算符优先级。

    试试

    Console.WriteLine("Is null: " + (o == null));
    

    在您的代码中,首先将o 添加到"Is null: " 字符串,然后检查它是否为空。当然不是,所以它被评估为假。你的调用和你写的一样

    Console.WriteLine(false.ToString());
    

    这就是为什么只打印“False”,即使没有你的字符串。

    【讨论】:

    • 很好的补充说明它只显示“False”,而不是“Is null: False”
    【解决方案2】:

    为什么容易;想想你写的实际上是这样的:

    object o = null;
    Console.WriteLine(("Is null: " + o) == null); // returns false
    

    它正在测试 "Is null: " + onull,这将始终是 false。这是由于运算符优先级规则,+== 之前。

    您应该明确应用括号以确保它按您想要的方式工作:

    Console.WriteLine("Is null: " + (o == null)); // returns true
    

    Jim Rhodes 在 cmets 中指出:

    这是您应该始终使用括号并且从不依赖编译器优先规则的几个原因之一。

    我表示自己同意;我什至没有尝试自己记住运算符优先规则,而是一直用括号明确表示。我进一步建议,这也是在依赖隐式类型转换和/或具有多个重载的方法时要非常小心的原因之一。

    我还想指出,我真的很喜欢Ravadretheir answer 中提到的东西;关于为什么只打印“False”,而不是您尝试打印的整个文本。

    【讨论】:

    • 这是您应该始终使用括号并且从不依赖编译器优先规则的几个原因之一。
    • @JimRhodes 确实;我什至不尝试自己记住运算符优先规则。如果它可能可能是一个问题,我会在我的代码中明确指出优先级。此示例也是显示依赖显式类型转换可能导致混淆的情况。
    【解决方案3】:

    其他答案已正确诊断出问题:连接的运算符优先级高于相等。然而,没有人解决的是你的程序中更根本的错误,那就是你正在做连接。编写代码的更好方法是:

    Console.WriteLine("is null: {0}", obj == null);
    

    现在不可能存在运算符优先级问题,因为所讨论的表达式只有一个运算符。

    一般来说,在执行输出时,您应该避免字符串连接,并支持字符串替换。它更容易正确,更灵活,更容易本地化使用这种技术编写的程序,等等。

    【讨论】:

    • 但是,如果连接不包括表达式(只有变量,甚至可能是常量)并且它是简短而简单的?在许多情况下,串联更短、更清晰并且性能更好。您如何看待这些论点?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 2016-07-11
    相关资源
    最近更新 更多