我正在寻找 Array.Clear(...)
方法在 C# 中的作用的答案。
我查看了 IL,但这并没有真正产生任何线索,因为它只是调用 mscorlib 中的 System.Array::Clear(...)
方法,然后调用我无法观察到的 CLR 的非托管部分。
我之所以这么问,是因为我偶尔会通过调用 Array.Clear 得到一个 SEHException,而且我似乎无法弄清楚为什么会发生这种情况。
不幸的是,微软似乎对抛出异常时可能意味着什么守口如瓶......
来自:http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.sehexception(v=VS.100).aspx
最佳答案
您可以在 SSCLI20 源代码中看到这种代码。去除所有噪音后看起来像这样:
FCIMPL3(void, SystemNative::ArrayClear, ArrayBase* pArrayUNSAFE, INT32 iIndex, INT32 iLength)
{
BASEARRAYREF pArray = (BASEARRAYREF)pArrayUNSAFE;
// error checks
//..
char* array = (char*)pArray->GetDataPtr();
int size = pArray->GetMethodTable()->GetComponentSize();
ZeroMemory(array + (iIndex - lb) * size, iLength * size);
}
换句话说,它只是将 0 个字节放入元素中。获得 SEHException 的唯一方法是通过处理器故障。 GC 堆损坏。查看任何 pinvoke 或 COM 互操作代码。
关于c# - Array.Clear 实际上在幕后做什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5557609/