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
。 请注意, Clear
是SZArrayHelper
的实例方法,定义如下。
private void Clear() { throw new NotSupportedException(Environment.GetResourceString("NotSupported_ReadOnlyCollection")); }
谁创建了“SZArrayHelper”的实例,并注意到Clear方法是私有的 。 我很困惑地看到发生了什么。 如果创建了一个“SZArrayHelper”实例并且调用了Clear
则执行此调用的辅助方法应该出现在“StackTrace”中。 但这不是这种情况。
有人可以解释一下幕后发生的事情吗?
注意:
-
int[]
只是一个例子,你几乎可以用任何类型的数组来模拟它。 而且不仅Clear
方法Add
,Contains
等拥有相同的行为.. -
我尝试使用reflection器插件调试,这给出了相同的结果调试器显示直接调用
SZArrayHelper.Clear()
。 -
只是一个谷歌带我到这个.NETarrays,IList,通用算法,以及STL怎么样? 。 这有助于理解某种魔法落后但神秘仍然存在。
你没有看到任何对该方法的调用,因为你自己调用它,就像听起来那样奇怪。 SZArrayHelper
是一个数组的CLR包装器,它实现了IList
接口,有点像适配器模式。
从这个角度来看, collection.Clear
直接调用SZArrayHelper.Clear
是有道理的。
Hans Passant在这里解释得非常好: https : //stackoverflow.com/a/11164210/857807
上述就是C#学习教程:System.Array背后的谜团分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1025585.html