2012-04-11 24 views
6

Vì tất cả chúng ta đều biết các chuỗi được khởi tạo ngầm, nghĩa là chúng ta không phải sử dụng new để có được tham chiếu đến một đối tượng của một.Liệu ldstr có thực thi nội bộ newobj không?

Bởi vì điều này đó là luôn luôn niềm tin của tôi rằng khuôn khổ đang chăm sóc này, và vì thế tôi sẽ nhận được IL giống hệt nhau nếu tôi đã làm một cái gì đó như thế này:

String first = new String(new char[] {'a'}); 
string second = "a"; 

Tuy nhiên có vẻ như dòng đầu tiên là được thực hiện bằng cách sử dụng newobj instance void [mscorlib]System.String::.ctor(char[]) và số thứ hai ldstr "a".

Vì vậy, để có được tham chiếu chuỗi, hãy ldstr gọi nội bộ newobj và nơi tôi có thể xem thông số/chi tiết để sao lưu này?

Trả lời

8

ldstr cung cấp cho bạn tham chiếu đến chuỗi ký tự là per the documentation (nhớ chuỗi ký tự được thực thi theo mặc định, vì vậy chúng chỉ được tạo một lần). Câu lệnh đầu tiên tạo một thể hiện thông thường là string sử dụng hướng dẫn newobj như mong đợi.

+0

Cảm ơn @Brian, tôi không biết tài liệu ở đâu! –

1

string đơn giản sau tha phương châm cơ bản cho tham khảo các loại đối tượng, đó là lý do tại sao trên new bạn thấy newobj.

Infact nếu bạn cố gắng viết một cái gì đó như thế này, nó sẽ không tạo newobj:

int a = new int(); 
a = 2; 
Console.WriteLine(a); 

Kết quả là IL sẽ

IL_0000: ldc.i4.0  
IL_0001: stloc.0  
IL_0002: ldc.i4.2  
IL_0003: stloc.0  
IL_0004: ldloc.0  
IL_0005: call  System.Console.WriteLine 

nếu bạn viết chỉ

int a = 2; 
Console.WriteLine(a); 

kết quả IL sẽ là

IL_0000: ldc.i4.2  
IL_0001: stloc.0  
IL_0002: ldloc.0  
IL_0003: call  System.Console.WriteLine 

Không có sự khác biệt từ điểm phân bổ của chế độ xem (có dòng bị bỏ lỡ tự nhiên), vì chúng ta đang nói về loại giá trị.

+0

Có. Ai nói rằng nó cho thấy? Tôi chỉ ra rằng việc unsing giống nhau trên kiểu giá trị không tiêm lệnh đó. – Tigran

+0

@BrianRasmussen: chỉnh sửa câu trả lời để làm cho nó rõ ràng hơn. – Tigran

+0

Xin lỗi, tôi đã hiểu lầm quan điểm của bạn. –

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