我正在寻找一个回答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互操作代码.