为什么没有;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的引用。有人能向我解释一下原因吗?谢谢
这里没有任何错误,因为您没有试图取消引用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字符串与包含字符"blah"的字符串进行比较,并且没有else语句。
当然,我认为在尝试比较字符串时使用==是错误的。
从技术上讲,当使用==比较时,"狗和男孩一起打球"answers"Dog和男孩一起踢球''0"不等于真的。