Boxing/unboxing Và Casting Type In C# – CODER BLOG
Có thể bạn quan tâm
Boxing/unboxing là gì?
Boxing là quá trình chuyển đổi kiểu giá trị thành kiểu object hoặc là bất kỳ interface type mà nó implement. Khi CLR boxed một value type, nó tạo ra một object System.Object và lưu trữ giá trị đó ở managed heap.
Vì tất cả các kiểu value trong c# đều có thể coi là 1 object nên ta luôn luôn có thể boxed một kiểu giá trị thành kiểu object.
Lấy ví dụ cho dễ hiễu nhá !
int i = 123; // The following line boxes i. object o = i;The object o can then be unboxed and assigned to integer variable i:
C# o = 123; i = (int)o; // unboxing
Boxing is used to store value types in the garbage-collected heap. Boxing is an implicit conversion of a value type to the type object or to any interface type implemented by this value type. Boxing a value type allocates an object instance on the heap and copies the value into the new object.
Unboxing
Unboxing is an explicit conversion from the type object to a value type or from an interface type to a value type that implements the interface. An unboxing operation consists of:
- Checking the object instance to make sure that it is a boxed value of the given value type.
- Copying the value from the instance into the value-type variable. int i = 123; // a value type object o = i; // boxing int j = (int)o; // unboxing

For the unboxing of value types to succeed at run time, the item being unboxed must be a reference to an object that was previously created by boxing an instance of that value type. Attempting to unbox null causes a NullReferenceException. Attempting to unbox a reference to an incompatible value type causes an InvalidCastException.
Boxing/unboxing được sử dụng trong các collection non-generic như System.Collection.ArrayList,…Các lớp này chỉ làm việc với object và cast mọi thứ thành Object vì thế khi ta gọi ArrayList.Add(int a) thì a sẽ được boxed thành kiểu object. Khi get giá trị từ ArrayList thì sẽ ta phải unboxing. Vì thế boxing/unboxing làm giảm hiệu năng chúng ta nên dùng các class generic thay thế như List<T>,…
Đây chính là lợi ích khi dùng Generic và lý do nó ra đời.
Khi muốn viết 1 class mà có thể dùng với nhiều kiểu dữ liệu khác nhau thì ta có 2 cách:
- Chuyển đổi tất cả các kiểu dữ liệu về object và làm viêc với nó -> nếu là value type thì dẫn đến boxing/unboxing -> giảm performance. Khó detect lỗi do kiểu dữ liệu gây ra trong quá trình biên dịch, khi runtime thì có thể sẽ phát sinh lỗi.
- Sủ dụng generic type: kiểu an toàn, có thể detect lỗi do kiểu dữ liệu gây ra trong quá trình biên dịch
Có liên quan
Từ khóa » Boxing/unboxing Là Gì
-
Boxing Và Unboxing - Nguyễn Anh Tuấn
-
Hãy Hạn Chế Dùng Boxing Và Unboxing Trong C# - CodeLearn
-
Boxing Và Unboxing Trong C# | For Better Life!
-
Hạn Chế Sử Dụng Boxing/unboxing – C# Best Practices | Tự Học ICT
-
Autoboxing Và Unboxing Trong Java - VietTuts
-
Kiểu Dữ Liệu Object Trong C# | How Kteam
-
Autoboxing Và Unboxing Trong Java - GP Coder (Lập Trình Java)
-
Sự Khác Nhau Giữa Boxing And Un-Boxing? - Phỏng Vấn IT
-
Tại Sao Chúng Ta Cần Boxing Và Unboxing Trong C #? - HelpEx
-
Boxing Và Unboxing Trong C #
-
Quyền Anh Và Unboxing Là Gì Và Sự đánh đổi Là Gì? - HelpEx
-
Boxing Và Unboxing Dữ Liệu - Lập Trình Hướng đối Tượng Với C Docx
-
Boxing And Unboxing - C# Programming Guide - Microsoft Docs