c# – Array.Clear实际上做了什么?

前端之家收集整理的这篇文章主要介绍了c# – Array.Clear实际上做了什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在寻找一个回答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

Any SEH exception that is not automatically mapped to a specific exception is mapped to the SEHException class by default. For more information,search on “unmanaged exceptions” and “Structured Exception Handling” in the MSDN Library.

解决方法

您可以在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#相关文章