Czym jest boxing i unboxing w C# i jak można uniknąć tych procesów?
sobes.tech AI
Odpowiedź od AI
Boxing to niejawna konwersja typu wartości na typ referencyjny object lub inny typ referencyjny pochodzący od object. W tym procesie wartość jest umieszczana w nowym obszarze pamięci na zarządzanym stercie.
Unboxing to jawna konwersja z typu referencyjnego object na typ wartości. Najpierw sprawdzane jest, czy obiekt jest instancją pożądanego typu wartości, a następnie jego pole danych jest kopiowane ze sterty.
Przykłady:
// Boxing
int wartośćTyp = 10;
object referencjaTyp = wartośćTyp; // wartośćTyp jest opakowywana w object
// Unboxing
int odpakowanaWartość = (int)referencjaTyp; // referencjaTyp jest odpakowywana do int
Unikanie boxingu i unboxingu można osiągnąć za pomocą generyków. Kolekcje i metody generyczne pracują bezpośrednio z typami wartości, bez konieczności ich konwersji do object. To poprawia wydajność i bezpieczeństwo typów.
Przykład z generykami:
// Użycie List<T> zamiast ArrayList
using System.Collections.Generic;
List<int> generycznaLista = new List<int>();
generycznaLista.Add(10); // Brak boxingu
int wartość = generycznaLista[0]; // Brak unboxingu
Użycie generyków zapobiega kosztom związanym z alokacją pamięci na stercie i kopiowaniem danych podczas boxingu/unboxingu, a także eliminuje błędy typu podczas wykonywania.