2012-04-17 5 views
6

estoy hurgando unos dlls en el marco de XNA usando ILSpy y me encontré con esto:sintaxis miembro de la clase impar muestra en ILSpy

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

¿Cuál es el signo de exclamación en el anterior? ¿Es un problema con ILSpy o algo más?

Nota, la clase tiene un destructor separado: private unsafe void ~KerningHelper().

+2

En CLI/C++ el! KerningHelper simbolizaría un 'finalizador' en lugar de un' destructor' ¿quizás tiene algo que ver con eso? Eche un vistazo aquí: http://en.wikipedia.org/wiki/C%2B%2B/CLI#Finalizers_and_automatic_variables – Nick

+1

No es válido C# en ambos sentidos, así que supongo que alguna representación IL que luego se traduce un poco hacia atrás incorrecto. –

+0

@ AdamHouldsworth: compré escribiendo mi propia clase con eso y llegué a la misma conclusión. Me interesa saber qué era originalmente/para qué sirve/cuál es la sintaxis original. :) –

Respuesta

5

Como dicen los comentarios, el signo de exclamación es el marcador C++/CLI para un método de finalizador. A diferencia de los destructores de C++ tradicionales (~) a los que se llama cuando se deshace explícitamente de un objeto, los finalizadores son llamados por el subproceso de recolector de elementos no utilizados. Puede ver los detalles oficiales here.

yo esperaría ILSpy para traducir el !KerningHelper() a ~KerningHelper(), ya que C++/CLI finalizador es equivalente al destructor de C# 's - Es un método no determinístico que se produce cuando el GC se pone a ella, a diferencia de C++/explícita ~ destructor de la CLI, el cual se invoca cuando llama al delete o se realiza una llamada a Dispose explícita.

+0

Gracias por la explicación, lo que me confundió es que el 'KerningHelper' también tenía un destructor, así que supongo que ILSpy usa'! 'Ya que es diferente a un destructor. Si conoces el uso de un finalizador, te lo agradecería, ya que en la clase que he encontrado creo que 'dispose' debería llamarse de todos modos, así que no entiendo su uso (es decir, cuándo se usaría un finalizador en lugar de/así como un destructor?). –

Cuestiones relacionadas