System.Array背后的谜团

我们知道System.Array是一个抽象类,我们使用运行时的任何DataType[]都会以某种方式为我们创建一些具体的实现(虽然含糊不清)。

请考虑以下代码段。

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

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

堆栈跟踪:

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

怎么可能呢? 我在int[]上调用Clear()方法,但是调用如何转到SZArrayHelper.Clear 。 请注意, ClearSZArrayHelper的实例方法,定义如下。

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

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

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

注意:

  1. int[]只是一个例子,你几乎可以用任何类型的数组来模拟它。 而且不仅Clear方法AddContains等拥有相同的行为..

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

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

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

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

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