2012-04-17 7 views
6

sto rovistando alcune DLL nel quadro XNA utilizzando ILSpy e sono imbattuto in questo:Odd sintassi membro della classe mostrata in ILSpy

class KerningHelper 
{ 
    private void !KerningHelper() 
    { 
     ((IDisposable)this).Dispose(); 
    } 
} 

Qual è il punto esclamativo per in quanto sopra? Si tratta di un problema con ILSpy o qualcos'altro?

Nota: la classe ha un distruttore separato: private unsafe void ~KerningHelper().

+2

In CLI/C++ il! KerningHelper simboleggia un 'finalizzatore' piuttosto che un' distruttore', forse è qualcosa a che fare con questo? Dai un'occhiata qui: http://en.wikipedia.org/wiki/C%2B%2B/CLI#Finalizers_and_automatic_variables – Nick

+1

Non è valido C# in entrambi i casi, quindi sto indovinando una rappresentazione di IL che viene poi tradotta leggermente sbagliato. –

+0

@AdamHouldsworth: ho controllato la scrittura della mia classe con quella e sono giunto alla stessa conclusione. Sono interessato a ciò che era in origine/a cosa serve/cosa è la sintassi originale. :) –

risposta

5

Come indicato nei commenti, il punto esclamativo è il marcatore C++/CLI per un metodo di finalizzazione. A differenza dei tradizionali distruttori C++ (~) che vengono chiamati quando si dispone esplicitamente di un oggetto, i finalizzatori vengono chiamati dal thread del garbage collector. Puoi vedere i dettagli ufficiali here.

mi aspetterei ILSpy per tradurre il !KerningHelper() a ~KerningHelper(), visto che il C++/CLI finalizzatore è equivalente al distruttore C# s '- E' un metodo non-deterministico che si verifica quando il GC arriva ad esso, a differenza di C++/esplicita ~ distruttore di CLI, che viene chiamato quando si chiama delete o viene effettuata una chiamata di eliminazione esplicita.

+0

Grazie per la spiegazione, ciò che mi ha confuso è che anche il 'KerningHelper' aveva un distruttore, quindi suppongo che ILSpy usi'! 'Poiché è diverso da un distruttore. Se sei a conoscenza di un utilizzo per un finalizzatore, lo apprezzerei come nella classe che ho trovato, penso che 'dispose' debba essere richiamato comunque, quindi non capisco il suo uso (cioè quando sarebbe usato un finalizzatore al posto di/così come un distruttore?). –

Problemi correlati