我刚刚在 dotPeek,String.cs 中找到它:
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
[__DynamicallyInvokable]
public override bool Equals(object obj)
{
if (this == null)
throw new NullReferenceException();
string strB = obj as string;
if (strB == null)
return false;
if (object.ReferenceEquals((object) this, obj))
return true;
if (this.Length != strB.Length)
return false;
else
return string.EqualsHelper(this, strB);
}
如果 this == null,则在第二行抛出 NullReferenceException。那么如何调用空对象的方法呢?
MSDN 说: 请注意,应用程序抛出 ArgumentNullException 异常,而不是这里讨论的 NullReferenceException 异常。
以下 Microsoft 中间语言 (MSIL) 指令引发 NullReferenceException:
callvirt
cpblk
cpobj
initblk
ldelem.<type>
ldelema
ldfld
ldflda
ldind.<type>
ldlen
stelem.<type>
stfld
stind.<type>
throw
unbox
如果我明白了,在进入方法体之前会抛出异常。正确的?那么需要从方法中抛出 NullReferenceException 吗?是否__DynamicallyInvokableAttribute
强制方法被称为绕过任何检查?或者是其他东西?
谢谢。