这是一个简单的问题,但我怀疑看到下面的代码
public static String something;
static void Main(string[] args)
{
try
{
if (something == "blah")
System.Console.Write("ok");
}
catch (Exception)
{
throw;
}
}
我知道不会抛出异常而是为什么?因为名称变量为null的变量,当你比较时,你试图用null获得引用。有人可以向我解释原因吗?谢谢!
答案 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 ”的字符串进行比较,并且您没有其他语句。
当你试图比较一个字符串是错误的时候,当然我会争论使用==。
技术上“狗与男孩打球