加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 08:06:59 所属栏目:百科 来源:网络整理
导读:我正在寻找一个回答Array.Clear(…)方法在C#的封面下做什么. 我看过IL,但这并没有真正产生任何线索,因为它只是调用mscorlib中的System.Array :: Clear(…)方法,然后调用CLR的非托管部分,我可以观察. 我问这个的原因是,我偶尔会因为调用Array.Clear而引发SEHE
我正在寻找一个回答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互操作代码.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读