2012-04-17 15 views
6

mam wywiercenie kilku bibliotek DLL w ramach XNA wykorzystaniem ILSpy i natknąłem się na to:Odd klasa składnia członkiem pokazano na ILSpy

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

Jaki jest wykrzyknik w powyższych? Czy to jest problem z programem ILSpy, czy z czymś innym? Uwaga: klasa ma osobny destruktor: private unsafe void ~KerningHelper().

+2

W CLI/C++! KerningHelper będzie symbolizował 'finalizer' zamiast' destruktor ', może to ma coś wspólnego z tym? Zajrzyj tutaj: http://en.wikipedia.org/wiki/C%2B%2B/CLI#Finalizers_and_automatic_variables – Nick

+1

To nie jest poprawne C# w obu kierunkach, więc zgaduję, że trochę reprezentacji IL, która jest następnie nieco przetłumaczyć źle. –

+0

@AdamHouldsworth: Sprawdziłem pisanie własnej klasy i doszedłem do tego samego wniosku. Interesuje mnie to, co było pierwotnie/do czego służy/jaka jest oryginalna składnia. :) –

Odpowiedz

5

Zgodnie z podanymi komentarzami, wykrzyknik jest znacznikiem C++/CLI dla metody finalizatora. W przeciwieństwie do tradycyjnych destruktorów C++ (~), które są wywoływane, gdy jawnie dysponujesz obiektem, finalizatory są wywoływane przez wątek funkcji czyszczenia pamięci. Możesz zobaczyć oficjalne szczegóły here.

spodziewałbym ILSpy przełożyć !KerningHelper() do ~KerningHelper(), ponieważ C++/CLI finalizator jest równoważny C# 's destructor - to niedeterministyczne metoda, która występuje, gdy GC dostaje się do niego, w przeciwieństwie do C++/CLI jest wyraźny ~ destruktor, który jest wywoływana, gdy wywołujesz delete lub wywoływane jest wyraźne wywołanie Dispose.

+0

Dzięki za wyjaśnienie, to co mnie zdezorientowało, to że 'KerningHelper' ma również destruktor, więc myślę, że ILSpy używa'! ', Ponieważ jest inny niż destruktor. Jeśli znasz jakieś zastosowanie dla finalizatora, to doceniłbym to tak, jak w klasie, którą odkryłem, i myślę, że 'dispose' powinien zostać wywołany, więc nie rozumiem jego użycia (tj. Kiedy użyłbym finalizatora zamiast/jak również destruktor?). –