我正在寻找 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/

10-13 06:21