4

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);
}

2行目では、this == nullの場合、NullReferenceExceptionがスローされます。では、どのようにしてnullオブジェクトのメソッドを呼び出すことができますか?

MSDNによると: アプリケーションは、ここで説明するNullReferenceException例外ではなく、ArgumentNullException例外をスローすることに注意してください。

次のMicrosoft中間言語(MSIL)命令は、NullReferenceExceptionをスローします。

callvirt
cpblk
cpobj
initblk
ldelem.<type>
ldelema
ldfld
ldflda
ldind.<type>
ldlen
stelem.<type>
stfld
stind.<type>
throw
unbox

取得すると、メソッド本体に入るに例外がスローされます。右?では、メソッドからNullReferenceExceptionをスローする必要があるのは何ですか?__DynamicallyInvokableAttributeチェックをバイパスしてメソッドを強制的に呼び出すことはできますか?または、他の何か?

ありがとう。

4

1 に答える 1

4

C#は、nullオブジェクトを入力する前にNullReferenceExceptionを取得するcallvirtを使用します。しかし、BCLは多数の言語用に作成されているため、呼び出し命令を使用する一部の中央部分(文字列など)のnullオブジェクトを防止しました。

マネージC++は、呼び出し命令の最も注目すべきユーザーです。

これは(私が知る限り)少しデバッグを支援するために行われましたが、BCL全体でまったく一貫していません。

于 2012-10-20T06:06:45.630 に答える