为什么没有;Don’不要抛出异常

本文关键字:抛出异常 Don 为什么 | 更新日期: 2023-09-27 17:59:52

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

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

我知道这不会引发异常,但为什么?因为名称为null的变量,当你进行比较时,你试图获得一个具有null的引用。有人能向我解释一下原因吗?谢谢

为什么没有;Don’不要抛出异常

这里没有任何错误,因为您没有试图取消引用something。您将获得其,即null。如果您试图取消引用它(即something.somemethod()),则会引发异常。

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

IL_0002:ldsfld字符串ConsoleApplication1.程序::somethingIL_0007:ldstr"blah"IL_000c:调用bool[mcorlib]系统。字符串::op_Equality(字符串,字符串)

String.op_Equality方法:

公共静态布尔运算符==(字符串a,字符串b)

a-字符串或空引用

b-字符串或空引用

op_Equality允许传递null引用,并且不会抛出异常。

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

所以它不会抛出异常,因为

null=="string"

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

您可以将null与字符串进行比较,结果是它们不相等。在这种情况下,Something是null——你不必"取消引用"就可以在比较中使用它,null值本身就是有效的。

由于something变量为null,因此将其与字符串值进行比较与表示相同

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

很明显,null和"blah"不一样,所以它会返回false,不会抛出异常。

字符串是一种可以为null的类型。

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

当然,我认为在尝试比较字符串时使用==是错误的。

从技术上讲,当使用==比较时,"狗和男孩一起打球"answers"Dog和男孩一起踢球''0"不等于真的。