2016-05-22 13 views
10

Tôi mới đến lập trình,Boxing và Unboxing có xảy ra trong mảng không?

Theo MSDN,

Boxing là quá trình chuyển đổi một loại giá trị cho các đối tượng loại hoặc cho bất kỳ loại giao diện thực hiện theo loại giá trị này. Khi CLR chứa một kiểu giá trị, nó kết thúc tốt đẹp giá trị bên trong một System.Object và lưu trữ nó trên vùng quản lý. Unboxing chiết xuất loại giá trị từ đối tượng. Boxing là tiềm ẩn; unboxing là rõ ràng.

Tôi biết Chúng tôi có thể lưu trữ bất kỳ đối tượng nào trong danh sách theo mảng, vì system.object là cơ sở cho tất cả các loại. Boxing và unboxing xảy ra trong danh sách mảng. Tôi đồng ý với điều đó.

Việc boxing và unboxing có xảy ra trong một mảng không? Vì chúng tôi có thể tạo mảng đối tượng như bên dưới

object[] arr = new object[4] { 1, "abc", 'c', 12.25 }; 

Hiểu biết của tôi về việc đánh đấm và giải mã diễn ra đúng như vậy?

+0

Không có quyền anh ở đây, vì mảng của bạn đã có đối tượng kiểu. không có gì để hộp trong trường hợp đó. –

+0

@ Zohar - Nhưng loại đối tượng là kiểu mặc định cho danh sách mảng đúng, Nhưng quyền anh và unboxing xảy ra ở đó – Aishu

+0

Làm thế nào bạn nói boxing không xảy ra ở đây, Vì đây là loại đối tượng, quyền anh nên xảy ra đúng không? – Aishu

Trả lời

12

Việc đánh đấm và bỏ hộp có xảy ra trong một mảng không?

Bản thân mảng này đã là loại tham chiếu, không có quyền tự do trên bản thân mảng đó. Tuy nhiên, vì một số yếu tố của bạn là các loại giá trị (int, doublechar) và loại mảng của bạn là object, một sự kiện sẽ diễn ra đối với phần tử đã nói. Khi bạn muốn trích xuất nó, bạn sẽ cần phải Unbox nó:

var num = (int)arr[0]; 

Bạn có thể nhìn thấy nó trong IL tạo:

IL_0000: ldarg.0 
IL_0001: ldc.i4.4 
IL_0002: newarr [mscorlib]System.Object 
IL_0007: dup 
IL_0008: ldc.i4.0 
IL_0009: ldc.i4.1 
IL_000a: box [mscorlib]System.Int32 // Boxing of int 
IL_000f: stelem.ref 
IL_0010: dup 
IL_0011: ldc.i4.1 
IL_0012: ldstr "abc" 
IL_0017: stelem.ref 
IL_0018: dup 
IL_0019: ldc.i4.2 
IL_001a: ldc.i4.s 99 
IL_001c: box [mscorlib]System.Char 
IL_0021: stelem.ref 
IL_0022: dup 
IL_0023: ldc.i4.3 
IL_0024: ldc.r8 12.25 
IL_002d: box [mscorlib]System.Double 
IL_0032: stelem.ref 
IL_0033: stfld object[] C::arr 
IL_0038: ldarg.0 
IL_0039: call instance void [mscorlib]System.Object::.ctor() 
IL_003e: nop 
IL_003f: ret 
6

Vâng, yếu tố kiểu giá trị (1, 'c 'và 12,25) sẽ được đóng hộp khi được đặt vào mảng object[].

Chuỗi "abc" sẽ được đặt vì nó là đối tượng kiểu tham chiếu.

5

Mỗi khi bạn gán một giá trị của một loại giá trị đến một biến kiểu object một hoạt động đấm bốc sẽ xảy ra, Vì vậy, khi bạn làm:

object[] arr = new object[4] { 1, "abc", 'c', 12.25 }; 

Đó là tương đương với

object[] arr = new object[4]; 
arr[0] = 1; 
arr[1] = "abc"; 
arr[2] = 'c'; 
arr[3] = 12.25 

Ba hộp sẽ được tạo để lưu trữ , 12.25'c' vì chúng là giá trị của các loại giá trị.

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