Boxing chuyển đổi loại giá trị thành loại đối tượng. Hoặc như MSDN đặt nó, boxing là một "hoạt động để bọc cấu trúc bên trong một đối tượng kiểu tham chiếu trên heap được quản lý."C# - Có thể sử dụng các hộp bể bơi không?
Nhưng nếu bạn cố gắng tìm hiểu điều đó bằng cách xem mã IL, bạn chỉ thấy từ "hộp" ma thuật.
suy đoán, tôi đoán rằng bộ thực thi có một số loại thuốc generic dựa trên lớp bí mật lên tay áo của mình, giống như Box<T>
với một tài sản public T Value
, và đấm bốc một int sẽ trông như thế:
int i = 5;
Box<int> box = new Box<int>;
box.Value = 5;
Unboxing int sẽ rẻ hơn rất nhiều: return box.Value;
Thật không may, ứng dụng máy chủ hoạt động kém hiệu quả của tôi có một chút công bằng, đặc biệt là số thập phân. Tệ hơn nữa, những chiếc hộp này có thời gian tồn tại ngắn, điều này khiến tôi nghi ngờ tôi phải trả hai lần, một lần cho việc phát hành hộp và sau đó một lần nữa để thu gom rác sau khi tôi hoàn thành nó.
Nếu tôi đã tự mình khai thác bộ nhớ này, tôi sẽ xem xét việc sử dụng một nhóm đối tượng ở đây. Nhưng kể từ khi tạo vật thể thực sự được ẩn đằng sau một từ kỳ diệu trong IL, lựa chọn của tôi là gì?
câu hỏi cụ thể của tôi:
- Có một cơ chế hiện có để gây runtime để có hộp từ một hồ bơi chứ không phải instanciating họ?
- Loại cá thể được tạo ra trong thời gian boxing là gì? Có thể tự kiểm soát quá trình boxing, nhưng vẫn tương thích với unboxing không?
Nếu câu hỏi cuối cùng có vẻ lạ, ý tôi là tôi có thể tự tạo lớp Box<T>
hoặc DecimalBox
của riêng mình, xếp chồng và hộp/hộp thủ công. Nhưng tôi không muốn phải đi và sửa đổi những nơi khác nhau trong mã mà tiêu thụ giá trị đóng hộp (aka unbox nó).
Bạn đã cân nhắc việc giảm hoạt động quyền anh bằng cách sử dụng generics/custom objects/etc.? Lệnh 'box' là cố ý mờ đục, mặc dù bạn có thể bắt chước nó thông qua lớp' Box 'ở trên. –
dlev
"ứng dụng của tôi có một chút công bằng boxing". Một trò chơi kỳ lạ, động thái chiến thắng duy nhất không phải là để chơi. –
"Tồi tệ hơn, những chiếc hộp này tồn tại trong thời gian ngắn, khiến tôi nghi ngờ tôi phải trả hai lần, một lần cho việc phát hành hộp và sau đó một lần nữa để thu gom rác sau khi tôi hoàn thành nó." Bạn đã lược tả điều đó, đúng không? tức là bạn biết rằng GC là một nút cổ chai trong đơn đăng ký của bạn vì bạn đã đo lường và không phải vì bạn đã đoán. Thời gian duy nhất tôi quản lý để có được GC ràng buộc đã được phân bổ mảng byte lớn thường xuyên. Nếu bộ sưu tập Gen0 là một nút cổ chai, bạn nên xem xét lại thiết kế của mình. – CodesInChaos