2010-06-05 7 views
5
var i = new int[2]; 

Có phải "i" được coi là đóng hộp không?Boxing & Unboxing

+1

Ngôn ngữ nào? C#? – kennytm

+0

Trong ngôn ngữ C# .. – Vivek

+1

@MarkRushakoff :) Tôi biết đây là một bài cũ, nhưng tôi đã cười tôi, thực sự làm đổ một ít cà phê :))) –

Trả lời

4

Mảng trong C# là kiểu tham chiếu nên không cần đấm bốc. tuy nhiên bạn sẽ phải đấm bốc trong ví dụ này:

var i = 123; 
object o = i; 
7

Giả sử đây là C# (var và C# -like cú pháp mảng), không, i không đóng hộp. Chỉ các kiểu giá trị nguyên thủy (nghĩ các giá trị số) mới có thể được đóng hộp.

Các giá trị trong mảng không được đóng hộp, vì các giá trị trong mảng nguyên thủy không được đóng hộp.

+1

Bạn có thể đặt bất kỳ cấu trúc nào, kể cả những cái bạn viết, xa hơn một chút so với điều này ngụ ý. Các kiểu giá trị được thực hiện trong .NET như các cấu trúc. – Donnie

9

Không có gì để đóng hộp. Từ khóa var không có nghĩa là biến được đóng hộp. Nó không thực hiện bất kỳ chuyển đổi nào trong thời gian chạy. Từ khóa var đúng là cấu trúc C#. Điều gì đang thực sự xảy ra khi bạn sử dụng var là:

var i = new int[1]; 

IL thấy nó như là:

int[] i = new int[1] 

Bây giờ nếu bạn đang yêu cầu nếu khi bạn gán một int vào một phần của mảng của tôi làm nó hộp ?

như:

i[0] = 2; 

Không có nó thì không.

này trái ngược với mà:

var o = new object[1]; 

o[0] = 2; 

Ví dụ này không và tại sao sử dụng ArrayList (nghĩ mảng có thể mở rộng) trong 1.0, 1.1 (generics trước) là một chi phí khổng lồ. Nhận xét sau đây áp dụng cho ví dụ object[] cũng như:

Bất kỳ tài liệu tham khảo hoặc giá trị kiểu đó là thêm vào một ArrayList là ngầm bị ném lên trời để Object. Nếu các mục là loại giá trị, chúng phải được đóng hộp khi thêm vào danh sách và không được mở hộp khi chúng được truy lục. Cả hai đúc và các hoạt động boxing và unboxing làm giảm hiệu suất; hiệu quả của việc đánh boxing và unboxing có thể khá là đáng kể trong các tình huống mà bạn phải lặp qua các bộ sưu tập lớn.

MSDN Link to ArrayList

Link to Boxing in C#

3

Boxing chỉ xảy ra khi một value type (ví dụ: một loại nguyên thủy, struct hoặc liệt kê) đang được coi là một loại tài liệu tham khảo. Mảng của bạn được khai báo để giữ các giá trị thuộc loại int. var keyword chỉ yêu cầu trình biên dịch suy ra loại biến i, thay vì bạn chỉ định nó theo cách thủ công.

Had bạn viết:

var i = new object[2]; 

Trình biên dịch sẽ dịch đó để object[] i = new object[2], và bất kỳ int giá trị mà bạn đặt trong đó sẽ được đóng hộp. Bất kỳ loại tham chiếu nào bạn đặt vào cùng một mảng sẽ không cần bất kỳ quyền anh nào.

Tóm lại, var không liên quan gì đến quyền anh.

Đây là số diagram of different types trong .NET. Bạn cũng có thể muốn đọc .NET Type fundamentals.