System.Array背后的谜团

Sri*_*vel 12 .net c#

我们知道System.Array是一个抽象类,无论DataType[]我们使用什么,运行时都会为我们创建一些具体的实现(虽然模糊不清).

请考虑以下代码段.

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

collection.Clear()抛出NotSupportedException,没有什么令人惊讶的.当我查看"StackTrace"时,我惊讶地发现它SZArrayHelper在调用堆栈顶部显示了一些奇怪的"类型" .

堆栈跟踪:

   at System.SZArrayHelper.Clear[T]()//Note this.. How???
   at TestApplication.Program.Main()
Run Code Online (Sandbox Code Playgroud)

怎么可能呢?我正在调用Clear()方法,int[]但是调用是如何进行的SZArrayHelper.Clear.请注意,这Clear是一个SZArrayHelper定义如下的实例方法.

private void Clear<T>()
{
    throw new NotSupportedException(Environment.GetResourceString("NotSupported_ReadOnlyCollection"));
}
Run Code Online (Sandbox Code Playgroud)

谁创建了"SZArrayHelper"的实例,并注意到Clear方法是私有的.我很困惑地看到发生了什么.如果创建了一个"SZArrayHelper"实例并且Clear被调用,那么执行此调用的辅助方法应该出现在"StackTrace"中.但这不是这种情况.

有人可以解释一下幕后发生的事情吗?

注意:

  1. int[]只是和例子,您可以使用任何类型的数组来模拟它.不仅Clear方法Add,Contains等等具有相同的行为..

  2. 我尝试使用反射器插件调试,这给出了相同的结果调试器显示直接调用SZArrayHelper.Clear<T>().

  3. 只是一个谷歌带我到这个.NET阵列,IList,通用算法,以及STL怎么样?.这有助于理解某种魔法落后但神秘仍然存在.

dca*_*tro 7

你没有看到任何对这种方法的调用,因为你自己调用它,就像听起来那样怪异.SZArrayHelper是一个围绕数组的CLR包装器,它实现了IList<T>接口,有点像适配器模式.

从这个角度来看,直接collection.Clear调用是有道理的SZArrayHelper.Clear.

Hans Passant在这里解释得非常好:https://stackoverflow.com/a/11164210/857807

  • 我支持这个答案:) (9认同)