Sobes.tech
Middle

Co je to boxing a unboxing v C# a jak se těmto procesům vyhnout?

sobes.tech AI

Odpověď od AI

Boxování je implicitní převod hodnotového typu na referenční typ object nebo jiný odvozený referenční typ od object. Během tohoto procesu je hodnota umístěna do nové oblasti paměti na spravovaném haldě.

Unboxing je explicitní převod z referenčního typu object na hodnotový typ. Nejprve se ověří, zda je objekt instancí požadovaného hodnotového typu, a poté se jeho datové pole zkopíruje ze zásobníku.

Příklady:

// Boxování (boxing)
int hodnotaTyp = 10;
object odkazTyp = hodnotaTyp; // hodnotaTyp je zabalen do `object`

// Rozbalení (unboxing)
int rozbalenáHodnota = (int)odkazTyp; // odkazTyp je rozbalen do int

Vyhnout se boxování a rozbalování lze pomocí generik. Generické kolekce a metody pracují přímo s hodnotovými typy, aniž by je bylo nutné převádět na object. To zvyšuje výkon a bezpečnost typů.

Příklad s generiky:

// Použití List<T> místo ArrayList
using System.Collections.Generic;

List<int> generickýSeznam = new List<int>();
generickýSeznam.Add(10); // Bez boxování

int hodnota = generickýSeznam[0]; // Bez rozbalení

Použití generik zabraňuje nákladům spojeným s alokací paměti na haldě a kopírováním dat při boxování/unboxing, a také zabraňuje chybám typu za běhu.