2012-02-20 30 views
10

Tôi tò mò muốn biết nếu tất cả các phôi trong C# kết quả trong boxing, và nếu không, là tất cả các phôi một hoạt động tốn kém?Làm tất cả C# phôi kết quả trong boxing/unboxing

Ví dụ lấy từ Boxing and Unboxing (C# Programming Guide)

int i = 123; 
    // The following line boxes i. 
    object o = i; 

dòng này rõ ràng gây đấm bốc (gói lên kiểu int như một đối tượng). Đây là một hoạt động được coi là tốn kém, vì nó tạo ra rác sẽ được thu thập.

Điều gì về phôi từ 2 loại tham chiếu khác nhau? chi phí đó là bao nhiêu? nó có thể được đo đúng không? (So ​​với ví dụ trước)

Ví dụ:

public class A 
{ 
} 

public class B : A 
{ 
} 

var obj = new B(); 
var obj2 = (A)obj; // is this an "expensive" operation? this is not boxing 
+8

Không có quyền liên quan đến quyền lực khi truyền từ một loại tham chiếu này sang loại tham chiếu khác. – BrokenGlass

+0

Có thể đo lường một cách thích hợp không? nên tránh nó? –

+0

Trong khi boxing không liên quan khi truyền một loại tham chiếu này sang loại tham chiếu khác, chuyển đổi có thể. Việc chuyển đổi một loại tham chiếu sang loại tham chiếu không liên quan khác có thể tốn kém. –

Trả lời

22

Tôi tò mò muốn biết nếu tất cả các chuyển đổi trong C# kết quả trong boxing.

số Chỉ chuyển đổi quyền Anh dẫn đến đấm bốc, vì thế mà cái tên 'đấm bốc chuyển đổi'. Boxing chuyển đổi đều built- trong các chuyển đổi từ các loại giá trị sang loại tham chiếu - đến một lớp mà loại giá trị kế thừa từ hoặc đến giao diện mà nó thực hiện (hoặc giao diện tương thích với giao diện mà nó thực hiện, thông qua chuyển đổi tham chiếu covariant hoặc contravariant).

đều là conver sions một hoạt động tốn kém?

Không. Chuyển đổi nhận dạng bằng 0 vì trình biên dịch có thể tách chúng hoàn toàn.

Chi phí chuyển đổi tham chiếu ngầm định và rõ ràng là gì?

Chuyển đổi tham chiếu ngầm định là chi phí bằng không. Trình biên dịch có thể tách chúng hoàn toàn. Đó là, chuyển đổi từ hươu cao cổ thành loại động vật cơ sở của nó, hoặc con hươu cao cổ đến kiểu giao diện thực hiện IAmATallMammal, là miễn phí.

Chuyển đổi tham chiếu rõ ràng liên quan đến kiểm tra thời gian chạy để xác minh rằng tham chiếu thực tế tham chiếu đến đối tượng thuộc loại mong muốn.

Kiểm tra thời gian chạy đó có "tốn kém" hay không phụ thuộc vào ngân sách của bạn.

chi phí đó có thể được đo chính xác không?

Chắc chắn. Quyết định tài nguyên nào có liên quan đến bạn - thời gian, nói - và sau đó cẩn thận đo mức tiêu thụ thời gian của bạn bằng đồng hồ bấm giờ.

Một câu hỏi mà bạn không hỏi nhưng có lẽ nên có:

chuyển đổi đắt nhất là gì?

Chuyển đổi do người dùng xác định không gì khác ngoài đường cú pháp cho cuộc gọi phương thức; phương pháp đó có thể mất nhiều thời gian tùy ý, giống như bất kỳ phương pháp nào.

Chuyển đổi động bắt đầu trình biên dịch một lần nữa khi chạy; trình biên dịch có thể mất nhiều thời gian tùy ý để thực hiện phân tích kiểu, tùy thuộc vào mức độ khó khăn của một vấn đề phân tích mà bạn chọn để ném vào nó.

+1

Eric, điều gì về một chuyển đổi tiềm ẩn được thực hiện bởi lập trình viên? Tôi đoán rằng đó cũng là elided bởi trình biên dịch. (Ví dụ: 'var o = (đối tượng)" Một số chuỗi "; return o.GetHashCode();') – phoog

+2

@phoog: Đúng. Không cần phải tạo ra IL cho điều đó; tham chiếu chuỗi đã được gán tương thích với biến. –

10

số

Boxing có nghĩa là đặt một giá trị vào một trường hợp loại tài liệu tham khảo mới.

Các phôi chuẩn giữa các loại tham chiếu không dẫn đến bất kỳ phân bổ nào.
(phôi người dùng định nghĩa có thể làm bất cứ điều gì)

+0

"Truyền từ một loại tham chiếu không dẫn đến bất kỳ phân bổ nào". Không nhất thiết phải đúng. – jason

+0

@Jason: Đã làm rõ – SLaks

+0

Đã xóa ghi đè. – jason

7

Tôi tò mò muốn biết nếu tất cả các phôi trong kết quả C# trong boxing,

số Boxing là một very special operation đó có nghĩa là đối xử với một thể hiện của một loại giá trị dưới dạng thể hiện của loại tham chiếu. Để chuyển đổi loại tham chiếu sang chuyển đổi loại tham chiếu, khái niệm không đóng vai trò nào.

tất cả đều hoạt động tốn kém?

Câu trả lời ngắn: Số

Long trả lời: Xác định tốn kém. Tuy nhiên không.

Điều gì về phôi từ 2 loại tham chiếu khác nhau? chi phí đó là bao nhiêu?

Vâng, điều gì sẽ xảy ra nếu nó chỉ là một chuyển đổi tham chiếu cơ bản? Đó là BLAZINGLY nhanh chóng bởi vì không có gì xảy ra.

Chuyển đổi khác do người dùng xác định có thể "chậm", chúng có thể "nhanh".

Chế độ này "chậm".

class A { public int Foo { get; set; } } 
class B { 
    public int Foo { get; set; } 
    static Random rg = new Random(); 
    static explicit operator A(B b) { 
     Thread.Sleep(rg.Next()); 
     return new A { Foo = b.Foo; } 
    } 
} 

Cái này là "nhanh".

class A { public int Foo { get; set; } } 
class B { 
    public int Foo { get; set; } 
    static Random rg = new Random(); 
    static explicit operator A(B b) { 
     return new A { Foo = b.Foo; } 
    } 
} 

var obj2 = (A)obj; // đây là một "đắt" hoạt động? đây không phải là boxing

Không, nó "rẻ"."

+0

hoạt động tốn kém có nghĩa là == nếu tôi có thuật toán liên quan đến lặp + đúc (không có quyền anh), có khôn ngoan hơn không khi thiết kế nó khác, hoặc là một hoạt động tầm thường không được coi là hiệu suất chi phí (theo thời gian thực hiện)) –

+0

@liortal: Nó phụ thuộc. Nếu bạn lo ngại về hiệu suất, hãy đo lường nó. – SLaks

+0

Tôi quan tâm đến việc hiểu cách thức hoạt động này nhiều hơn quan tâm cụ thể về hiệu suất đạt được –

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