gpt4 book ai didi

c# - System.Array 背后的 secret

转载 作者:可可西里 更新时间:2023-11-01 08:26:57 25 4
gpt4 key购买 nike

我们知道System.Array是一个抽象类,不管DataType[]我们使用运行时以某种方式为我们创建了一些具体的实现(尽管很模糊)。

考虑以下代码段。

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

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

堆栈跟踪:

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

这怎么可能?我调用 Clear() int[] 上的方法但是电话如何转到SZArrayHelper.Clear .注意 ClearSZArrayHelper中的一个实例方法定义如下。

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

谁创建了“SZArrayHelper”的实例,还注意到 Clear 方法是私有(private)的。我对正在发生的事情感到很困惑。如果创建了一个“SZArrayHelper”实例并且Clear被调用然后执行此调用的辅助方法应该出现在“StackTrace”中。但这里不是这种情况。

谁能解释一下幕后发生的事情?

注意:

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

  2. 我尝试使用反射器插件进行调试,结果相同。调试器显示对 SZArrayHelper.Clear<T>() 的直接调用.

  3. Google 引导我找到这个 .NET Arrays, IList, Generic Algorithms, and what about STL? .这有助于了解幕后发生的魔法,但仍然存在一些谜团。

最佳答案

您没有看到对该方法的任何调用,因为您正在自己调用它,这听起来很奇怪。 SZArrayHelper是围绕数组的 CLR 包装器,它实现了 IList<T>接口(interface),有点像适配器模式。

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

Hans Passant 在这里很好地解释了这一点:https://stackoverflow.com/a/11164210/857807

关于c# - System.Array 背后的 secret ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19914523/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com