Tìm hiểu về 'tên ma thuật' của trình gỡ lỗi VS ở đâu


110

Nếu bạn đã từng sử dụng Reflector, bạn có thể nhận thấy rằng trình biên dịch C # tạo ra các kiểu, phương thức, trường và biến cục bộ, xứng đáng được hiển thị 'đặc biệt' bởi trình gỡ lỗi. Ví dụ: các biến cục bộ bắt đầu bằng 'CS $' không được hiển thị cho người dùng. Có các quy ước đặt tên đặc biệt khác cho các kiểu đóng của các phương thức ẩn danh, các trường hỗ trợ của thuộc tính tự động, v.v.

Câu hỏi của tôi: tìm hiểu về các quy ước đặt tên này ở đâu? Có ai biết về một số tài liệu?

Mục tiêu của tôi là làm cho PostSharp 2.0 sử dụng các quy ước tương tự.

Câu trả lời:


209

Đây là các chi tiết triển khai không có tài liệu của trình biên dịch và có thể thay đổi bất kỳ lúc nào. (CẬP NHẬT: Xem GeneratedNames.cs trong các nguồn C # để biết chi tiết hiện tại; mô tả bên dưới hơi lỗi thời.)

Tuy nhiên, vì tôi là một chàng trai tốt, đây là một số chi tiết:

Nếu bạn có một biến cục bộ không sử dụng mà trình tối ưu hóa loại bỏ, chúng tôi vẫn gửi thông tin gỡ lỗi cho nó vào PDB. Chúng tôi đã gắn hậu tố __Deleted$vào các biến như vậy để trình gỡ lỗi biết rằng chúng ở trong mã nguồn nhưng không được biểu diễn trong hệ nhị phân.

Các vị trí biến tạm thời được phân bổ bởi trình biên dịch được đặt tên với mẫu CS $ X $ Y, trong đó X là "loại tạm thời" và Y là số lượng tạm thời được phân bổ cho đến nay. Các loại tạm thời là:

0 --> short lived temporaries
1 --> return value temporaries
2 --> temporaries generated for lock statements
3 --> temporaries generated for using statements
4 --> durable temporaries
5 --> the result of get enumerator in a foreach
6 --> the array storage in a foreach
7 --> the array index storage in a foreach.  

Các loại tạm thời từ 8 đến 264 là kho lưu trữ chỉ số mảng bổ sung cho các mảng đa chiều.

Các loại tạm thời trên 264 được sử dụng cho các thời gian tạm thời liên quan đến câu lệnh cố định sửa một chuỗi.

Các tên do trình biên dịch tạo đặc biệt được tạo cho:

1 --> the iterator state ("state")
2 --> the value of current in an iterator ("current")
3 --> a saved parameter in an iterator
4 --> a hoisted 'this' in an iterator ("this")
5 --> a hoisted local in an iterator
6 --> the hoisted locals from an outer scope
7 --> a hoisted wrapped value ("wrap")
8 --> the closure class instance ("locals")
9 --> the cached delegate instance ("CachedAnonymousMethodDelegate")
a --> the iterator instance ("iterator")
b --> an anonymous method
c --> anonymous method closure class ("DisplayClass")
d --> iterator class
e --> fixed buffer struct ("FixedBuffer")
f --> anonymous type ("AnonymousType")
g --> initializer local ("initLocal")
h --> query expression temporary ("TransparentIdentifier")
i --> anonymous type field ("Field")
j --> anonymous type type parameter ("TPar")
k --> auto prop field ("BackingField")
l --> iterator thread id
m --> iterator finally ("Finally")
n --> fabricated method ("FabricatedMethod")
o --> dynamic container class ("SiteContainer")
p --> dynamic call site ("Site")
q --> dynamic delegate ("SiteDelegate")
r --> com ref call local ("ComRefCallLocal")
s --> lock taken local ("LockTaken")

Mô hình để tạo ra các tên ma thuật là: P<N>C__SItrong đó:

  • P là CS $ cho các đại biểu được lưu trong bộ nhớ cache và các thể hiện lớp hiển thị, nếu không thì sẽ trống.
  • N là tên gốc liên quan đến sự vật, nếu có
  • C là ký tự từ 1 đến s được liệt kê ở trên
  • S là một hậu tố mô tả ("hiện tại", "trạng thái", v.v.) để bạn không cần phải ghi nhớ bảng trên khi đọc siêu dữ liệu.
  • Tôi là một số duy nhất tùy chọn

2
Cảm ơn bạn! Tôi sẽ xem liệu tôi có thể làm cho các lớp đóng PostSharp hoạt động tốt như những gì trình biên dịch C # tạo ra không!
Gael Fraiteur

7
@SLaks: Ngược lại với tạm thời ngắn ngủi. Thời gian lâu bền về cơ bản là các biến cục bộ không có tên; chúng có một vị trí cụ thể trên ngăn xếp tồn tại suốt thời gian tồn tại của khung ngăn xếp. Thời gian tồn tại ngắn hạn chỉ được đẩy lên ngăn xếp khi cần lưu trữ và sau đó bật ra khi không còn cần thiết. Thời gian tạm thời bền dễ gỡ lỗi hơn nhiều, nhưng có thể làm cho thời gian tồn tại của các thời gian tạm thời dài hơn nhiều. Chúng tôi tạo ra thời gian tạm thời lâu dài khi tối ưu hóa bị tắt.
Eric Lippert

Tôi có một khái niệm tương tự như các lớp đóng, nhưng thay vì có các tham số được kéo dưới dạng trường, tôi có chúng dưới dạng các biến cục bộ. Điều này hoạt động khá tốt cho các tham số, nhưng làm thế nào để nói với trình gỡ lỗi rằng 'đây' không phải là 'ldarg.0' mà là biến cục bộ với chỉ số 4? Có tên ma thuật nào không?
Gael Fraiteur

23
@Eric - bạn có thể cập nhật phản hồi này bằng các tên được tạo bởi C # 5.0 (async / await) không? Tôi đã nhìn thấy một số tiền tố mới :)
Gael Fraiteur
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.