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.