Sobes.tech
Middle

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.