- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我们知道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
.注意 Clear
是SZArrayHelper
中的一个实例方法定义如下。
private void Clear<T>()
{
throw new NotSupportedException(Environment.GetResourceString("NotSupported_ReadOnlyCollection"));
}
谁创建了“SZArrayHelper”的实例,还注意到 Clear 方法是私有(private)的。我对正在发生的事情感到很困惑。如果创建了一个“SZArrayHelper”实例并且Clear
被调用然后执行此调用的辅助方法应该出现在“StackTrace”中。但这里不是这种情况。
谁能解释一下幕后发生的事情?
注意:
int[]
只是一个例子,你几乎可以用任何类型的数组来模拟它,而不仅仅是 Clear
方法 Add
, Contains
etc 具有相同的行为。
我尝试使用反射器插件进行调试,结果相同。调试器显示对 SZArrayHelper.Clear<T>()
的直接调用.
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/
我正在寻找匹配 /(?=\W)(gimme)(?=\W)/gi 或类似的东西。 \W 应该是零宽度字符来包围我的实际匹配项。 也许有一些背景。我想用添加的文字填充替换某些单词(总是 \w+),但前提是
如何在不使用 Intent 连接到 VPN 服务的情况下以编程方式检测流量是否正在通过 VPN。有系统调用吗? 最佳答案 这个有效: private boolean checkVPN() {
我是一名优秀的程序员,十分优秀!