为什么这不会引发异常

时间:2011-06-22 13:48:18

标签: c#

这是一个简单的问题,但我怀疑看到下面的代码

public static String something;
    static void Main(string[] args)
    {
        try
        {
            if (something == "blah")
                System.Console.Write("ok");
        }
        catch (Exception)
        {

            throw;
        }

    }

我知道不会抛出异常而是为什么?因为名称变量为null的变量,当你比较时,你试图用null获得引用。有人可以向我解释原因吗?谢谢!

6 个答案:

答案 0 :(得分:24)

这里没有错,因为你没有尝试取消引用 something。您将获得,即null。如果您尝试取消引用(即something.somemethod()),则会抛出异常。

答案 1 :(得分:3)

这是由编译器生成的IL代码:

IL_0002:  ldsfld     string ConsoleApplication1.Program::something
IL_0007:  ldstr      "blah"
IL_000c:  call       bool [mscorlib]System.String::op_Equality(string, string)

String.op_Equality方法:

public static bool operator ==(string a,string b)

a - 字符串或空引用

b - 字符串或空引用

op_Equality允许传递空引用,不会抛出异常。

答案 2 :(得分:2)

变量,某些东西,不需要为这种比较实例化。它知道如何将自己与null进行比较。

所以它不会抛出异常因为

null ==" string"

是一个有效的比较,返回false。

答案 3 :(得分:0)

您可以将null与字符串进行比较 - 结果是它们不相等。在这种情况下,Something为null - 您不必“取消引用”以在比较中使用它,null值本身也可以。

答案 4 :(得分:0)

因为something变量为null,所以将它与字符串值进行比较与说

相同
if(null == "blah")...

显然null和“blah”不一样,所以它会返回false,不会抛出异常。

答案 5 :(得分:0)

字符串是可以为空的类型。

因此,您在给定的代码中将 NULL 字符串与包含字符“ blah ”的字符串进行比较,并且您没有其他语句。

当你试图比较一个字符串是错误的时候,当然我会争论使用==。

技术上“狗与男孩打球”和“狗与男孩打球 \ 0”在使用==比较时不会等于true