16

System.Arrayは抽象クラスであり、ランタイムを使用するものは何であれ、何らかのDataType[]形で具体的な実装を作成します (あいまいですが)。

次のスニペットを検討してください。

int[] someInts = { 1, 2, 3, 4 };
IList<int> collection = someInts;
collection.Clear();

collection.Clear()throws NotSupportedException、驚くべきことは何もありません。「StackTrace」を確認するSZArrayHelperと、呼び出しスタックの上部に奇妙な「タイプ」が表示されていることに驚いています。

スタックトレース:

   at System.SZArrayHelper.Clear[T]()//Note this.. How???
   at TestApplication.Program.Main()

どうしてそれが可能なのですか?Clear()メソッド onを呼び出しint[]ていますが、呼び出しはどのように に行きますかSZArrayHelper.Clear? 以下のように定義されClearたインスタンスメソッドであることに注意してください。SZArrayHelper

private void Clear<T>()
{
    throw new NotSupportedException(Environment.GetResourceString("NotSupported_ReadOnlyCollection"));
}

誰が「SZArrayHelper」のインスタンスを作成し、Clear メソッドがprivateであることにも注意してください。何が起こっているのか非常に混乱しています。「SZArrayHelper」のインスタンスが作成されてClear呼び出された場合、この呼び出しを行うヘルパー メソッドは「StackTrace」に含まれる必要があります。しかし、ここではそうではありません。

誰かが舞台裏で何が起こっているのか説明できますか?

ノート:

  1. int[]は単なる例です。ClearメソッドAddなどだけでなく、任意のタイプの配列でほぼシミュレートできContainsます。同じ動作をします。

  2. リフレクターアドインを使用してデバッグしようとしましたが、同じ結果が得られました。デバッガーは への直接呼び出しを示しますSZArrayHelper.Clear<T>()

  3. Google は、この.NET 配列、IList、ジェネリック アルゴリズム、そして STL について教えてくれました。. 舞台裏で行われている魔法の種類を理解するのに役立ちましたが、まだいくつかの謎が残っています.

4

1 に答える 1