2012-04-14 40 views
5

Tôi đã cố gắng để hiểu đoạn này, nhưng bằng cách nào đó tôi không thể ảo hóa nó trong tâm trí của tôi, một số một xin hãy giải thích nó một chút:Unboxing Giá trị các loại từ Objects

Unboxing không phải là hoàn toàn ngược lại đấm bốc. Các hoạt động unboxing là ít tốn kém hơn nhiều so với boxing. Unboxing thực sự chỉ là thao tác của việc lấy con trỏ tới kiểu giá trị thô (trường dữ liệu) chứa trong một đối tượng. Trong thực tế, con trỏ đề cập đến phần không được mở hộp trong thể hiện được đóng hộp. Vì vậy, không giống như boxing, unboxing không liên quan đến việc sao chép của bất kỳ byte nào trong bộ nhớ. Đã thực hiện việc làm rõ quan trọng này , điều quan trọng cần lưu ý là thao tác unboxing là thường được theo sau bằng cách sao chép các trường.

Richter, Jeffrey (2010-02-05). CLR qua C# (Địa chỉ Kindle 4167-4171). OReilly Media - A. Kindle Edition.

+0

có chính xác cùng một câu hỏi khi đọc đến đoạn – zinking

Trả lời

6

Để tạo hộp, bạn cần phải tạo đối tượng trên heap đủ lớn để giữ tất cả dữ liệu mà cấu trúc giữ. Phân bổ một đối tượng mới trên heap có nghĩa là làm việc cho GC để tìm một điểm, và làm việc cho GC để làm sạch nó/di chuyển nó xung quanh trong và sau cuộc đời của nó. Các hoạt động này, trong khi không phải siêu đắt tiền, cũng không rẻ.

Để bỏ chọn một loại giá trị, tất cả những gì bạn đang làm là bỏ tham chiếu đến con trỏ, để nói. Bạn chỉ cần nhìn vào tài liệu tham khảo (đó là những gì các object bạn có là) để tìm vị trí của các giá trị thực tế. Tìm kiếm một giá trị trong bộ nhớ rất rẻ, đó là lý do tại sao đoạn văn đó nói 'unboxing' rẻ.

Cập nhật:

Trong khi một kiểu giá trị không có hộp bọc thường sẽ được sao chép vào một số vị trí khác ngay sau khi không có hộp bọc, đó không phải là luôn luôn như vậy. Hãy xem xét ví dụ sau:

public struct MyStruct 
{ 
    private int value = 42; 
    public void Foo() 
    { 
    Console.WriteLine(value); 
    } 
} 

static void Main() 
{ 
    object obj = new MyStruct(); 
    ((MyStruct)obj).Foo(); 
} 

Các MyStruct được đóng hộp vào obj nhưng khi nó không có hộp bọc nó không bao giờ sao chép bất cứ nơi nào, một phương pháp đơn giản là gọi vào nó. LIkewise bạn có thể kéo một tài sản/lĩnh vực ra khỏi cấu trúc và sao chép chỉ là một phần của nó mà không cần phải sao chép toàn bộ điều. Điều này có vẻ hơi khó hiểu, nhưng nó vẫn không hoàn toàn vô lý. Điều đó nói rằng, như báo giá của bạn ngụ ý, nó vẫn có khả năng sao chép các cấu trúc sau khi bạn unbox nó.

+0

Nhưng sau khi tìm thấy giá trị, các giá trị sẽ được sao chép trở lại vào Stack, đúng không? – Tarik

+0

@Braveyard Không, không phải vậy. Nó khá phổ biến rằng một khi giá trị được unboxed nó sẽ được sao chép, nhưng nó không cần phải được. Ngoài ra, nó có thể không được sao chép trở lại vào ngăn xếp, nó có thể được sao chép vào một trường của một số loại tham chiếu khác trên heap. – Servy

+0

Tôi đã thêm một mẫu mã vào câu trả lời. – Servy