2012-04-17 26 views
6

Tôi chọc xung quanh một vài dlls trong khuôn khổ XNA sử dụng ILSpy và đi qua này:Odd cú pháp thành viên lớp thể hiện trong ILSpy

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

dấu chấm than cho ở trên là gì? Đây có phải là vấn đề với ILSpy hay một vấn đề khác?

Lưu ý, lớp học có một destructor riêng biệt: private unsafe void ~KerningHelper().

+2

Trong CLI/C++, KerningHelper sẽ tượng trưng cho 'finalizer' chứ không phải là' destructor' có lẽ nó liên quan đến điều đó? Có một cái nhìn ở đây: http://en.wikipedia.org/wiki/C%2B%2B/CLI#Finalizers_and_automatic_variables – Nick

+1

Nó không phải là hợp lệ C# một trong hai cách, vì vậy tôi đoán một số đại diện IL mà sau đó được dịch trở lại một chút sai rồi. –

+0

@AdamHouldsworth: Tôi đã kiểm tra viết lớp của riêng mình với điều đó và đi đến cùng một kết luận. Tôi quan tâm đến những gì nó đã được ban đầu/những gì nó cho/cú pháp ban đầu là gì. :) –

Trả lời

5

Như các nhận xét đã nêu, dấu chấm than là điểm đánh dấu C++/CLI cho phương thức finalizer. Không giống như các hàm hủy C++ truyền thống (~) được gọi khi bạn loại bỏ một đối tượng một cách rõ ràng, các finalizers được gọi bởi luồng thu gom rác. Bạn có thể xem chi tiết chính thức here.

Tôi mong chờ ILSpy để dịch !KerningHelper() để ~KerningHelper(), vì C++/CLI finalizer là tương đương với destructor C# 's - đó là một phương pháp không xác định xảy ra khi GC được với nó, không giống như C++/rõ ràng ~ destructor CLI, mà được gọi khi bạn gọi delete hoặc một cuộc gọi Dispose rõ ràng được thực hiện.

+0

Cảm ơn lời giải thích, những gì tôi bối rối là 'KerningHelper' có một destructor quá, vì vậy tôi đoán ILSpy sử dụng'! 'Vì nó khác với một destructor. Nếu bạn biết về việc sử dụng cho finalizer, tôi đánh giá cao nó như trong lớp tôi đã thấy tôi nghĩ rằng 'dispose' nên được gọi là anyway vì vậy tôi không hiểu việc sử dụng nó (tức là khi nào finalizer được sử dụng thay vì/cũng như một destructor?). –

Các vấn đề liên quan