2011-04-05 7 views
6

Array.Clear (...) yönteminin C# 'daki kapakların altında ne yaptığını bulmak için bir yanıt arıyorum.Array.Clear aslında kapakların altında ne yapıyor?

IL'ye baktım, ancak bu herhangi bir ipucu vermez, çünkü sadece mscorlib'de System.Array :: Clear (...) yöntemini çağırır, sonra da yönetilmeyen bir bölümünü çağırır. Gözlemleyemediğim CLR.

Bunu sormamın nedeni, bazen Array.Clear çağrısı sırasında atılan bir SEHException alıyorum ve bunun neden olduğunu anlayamıyorum. otomatik eşlenmedi http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.sehexception(v=VS.100).aspx

"Herhangi SEH istisna:

Ne yazık ki Microsoft itibaren

... istisnası atılır zaman ne anlama geldiğini konusunda biraz ketum gibi görünüyor özel bir istisna, varsayılan olarak SEHException sınıfıyla eşleştirilir.Daha fazla bilgi için, MSDN Kitaplığı'nda "yönetilmeyen özel durumlar" ve "Yapılandırılmış Özel Durum İşleme" konusuna bakın. "

Bu konuda herhangi bir yardım için teşekkür ederiz ... sadece doğru yönde bana gelin!

Teşekkürler!

+0

Temizlemeye çalıştığınız bir Diziniz nedir? Neden nesne türü? – rsbarro

+0

Hatayı yeniden üreten en küçük miktarda kodu gönderin. – jason

+0

Yöntemi her zaman (eski ücretsiz) .NET Reflektör ile ayırabilirsiniz. Bu size tam olarak neler olduğunu anlatacak. –

cevap

5

Bu tür kodları SSCLI20 kaynak kodunda görebilirsiniz. kaldırıldı tüm gürültü ile şöyle hangisi:

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); 
} 

Başka bir deyişle, sadece unsurları içine 0 bayt patlamalar. Bir SEHException almanın tek yolu bir işlemci arızasıdır. GC yığın bozulması. Herhangi bir pinvoke veya COM interop kodunu gözden geçirin.

+0

Tam olarak aradığım şey buydu ... Kod, oldukça büyük bir uygulamaya gömüldüğünden, bunu çoğaltmak için gerçekten kod gönderemiyorum. Ama gerçekte olan tek şey, 4096 baytlık bir bayt dizisini temizlemeye çalışıyorum. Sorun, hatanın tutarsız bir şekilde kırpılmasıdır, bu yüzden bunun için bir test uygulaması yazmanın bir yolu yoktur. –

+0

Ayrıca, projemde herhangi bir pinvoke veya COM birlikte çalışma kodu yok, dolayısıyla kontrolümden daha düşük bir seviyede bir çeşit yolsuzluk gibi görünüyor. –

+0

Acı verici. Eski bir sürümün olmadığı sürece CLR'yi dikkate almayın. Çevresel bir şey, herhangi bir süreçte kendini yaratan şey. Özel durumun ErrorCode değeri nedir? –

6

O i başlık altında neler olduğunu yakından eşleştirmesini göstermeye çalışıyorum envisionArray.Clear en kolay Ben Array.Clear aslında genel bir yöntem değildir gerçekleştirmek yüzden

public static void Array.Clear<T>(T[] array) { 
    for (int i = 0; i < array.Length; i++) { 
    array[i] = default(T); 
    } 
} 

gibi yazılıyor var . Bu kod bir SEHException atıyor Eğer

memcopy(&array, 0, array.Length * sizeof(T)); 

daha yakın Gerçekten olsa o zaman en olası nedeni, kaynak dizide etrafında bellek bozuk olduğunu. En olası kaynak yanlış bir PInvoke veya COM interop çağrısıdır.