System.Array背后的奥秘我们知道System.Array是一个抽象类,我们在运行时使用的任何DataType[]都会以某种方式为我们创建一些具体的实现(尽管依稀)。考虑以下代码片段。int[]someInts={1,2,3,4};IList集合=someInts;集合.清除();collection.Clear()抛出NotSupportedException,没有比这更令人惊讶的了。当我查看“StackTrace”时,我惊讶地发现它在调用堆栈的顶部显示了一些奇怪的“Type”SZArrayHelper。堆栈跟踪:在System.SZArrayHelper.Clear[T]()//注意这个..如何???在TestApplication.Program.Main()这怎么可能?我在int[]上调用Clear()方法,但调用如何转到SZArrayHelper.Clear。请注意,Clear是SZArrayHelper的实例方法,定义如下。privatevoidClear(){thrownewNotSupportedException(Environment.GetResourceString("NotSupported_ReadOnlyCollection"));}谁创建了“SZArrayHelper”的实例并注意到Clear方法是私有的。我很困惑,看看发生了什么。如果创建了“SZArrayHelper”实例并调用了Clear,则执行此调用的辅助方法应出现在“StackTrace”中。但这种情况并非如此。有人可以解释幕后发生的事情吗?注意:int[]只是一个示例,您几乎可以使用任何类型的数组来模拟它。不仅Clear方法Add、Contains等具有相同的行为。我尝试使用反射器插件进行调试,结果相同。调试器显示SZArrayHelper.Clear()被直接调用。只是一个谷歌带我到这个.NETarrays、IList、通用算法,以及STL怎么样?.这有助于理解背后有某种魔法,但谜团依然存在。您看不到对该方法的任何调用,因为您是自己调用它,这听起来很奇怪。SZArrayHelper是实现IList接口的数组的CLR包装器,有点像适配器模式。从这个角度来看,collection.Clear直接调用SZArrayHelper.Clear是有道理的。HansPassant在这里解释的很好:https://stackoverflow.com/a/11164210/857807以上就是C#学习教程的全部内容:System.Array背后的玄机,如果对大家有用需要了解一下more关于C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
