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
解决方法
您可以在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互操作代码. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |