Quyền anh/unboxing xảy ra khi loại giá trị (như cấu trúc, int, dài) được chuyển đến đâu đó chấp nhận loại tham chiếu - chẳng hạn như object
.
Điều này xảy ra khi bạn rõ ràng tạo phương thức lấy thông số của đối tượng kiểu sẽ được chuyển qua loại giá trị. Nó cũng xuất hiện khi bạn sử dụng các bộ sưu tập không chung chung cũ hơn để lưu trữ các kiểu giá trị (thường là các kiểu nguyên thủy).
Bạn cũng sẽ thấy boxing xảy ra khi bạn sử dụng String.Format()
và chuyển nguyên thủy cho nó. Điều này là do String.Format()
chấp nhận một đối tượng params [] - kết quả trong việc đánh thức các tham số bổ sung trong cuộc gọi. Sử dụng phản xạ để gọi các phương thức cũng có thể dẫn đến boxing/unboxing, vì các API phản chiếu không có lựa chọn nào khác ngoài việc trả về object
vì loại thực không được biết tại thời gian biên dịch (và các API phản chiếu không thể là chung).
Các bộ sưu tập chung mới hơn không dẫn đến đánh boxing/unboxing, và do đó, thích hợp hơn với các bộ sưu tập cũ hơn vì lý do này (ví dụ: ArrayList, Hashtable, v.v.). Chưa kể chúng là an toàn.
Bạn có thể tránh các mối quan tâm quyền anh bằng cách thay đổi các phương thức chấp nhận các đối tượng chung chung. Ví dụ:
public void string Decorate(object a) // passing a value type results in boxing
{
return a.ToString() + " Some other value";
}
vs:
public void string Decorate<T>(T a)
{
return a.ToString() + " some other value";
}
Tôi đồng ý với bạn. Từ tất cả những gì tôi đã đọc về chủ đề này, tôi không nhận được điểm. Phải thiếu một cái gì đó :) –