Kas yra boxing ir unboxing C# kalboje ir kaip galima išvengti šių procesų?
sobes.tech AI
Atsakymas iš AI
Boxing (kapsuliavimas) — tai neapibrėžtas reikšmės tipo konvertavimas į nuorodos tipą object arba bet kurį kitą iš object kilusį nuorodos tipą. Šiuo procesu reikšmė yra įdedama į naują atminties sritį valdomame krūvoje.
Unboxing (išpakavimas) — tai aiškus konvertavimas iš object nuorodos tipo į reikšmės tipą. Pirmiausia tikrinama, ar objektas yra norimo reikšmės tipo pavyzdys, tada jo duomenų laukas kopijuojamas iš krūvos.
Pavyzdžiai:
// Kapsuliavimas (boxing)
int reikšmėsTipas = 10;
object nuorodaTipas = reikšmėsTipas; // reikšmėsTipas įpaketuojamas į `object`
// Išpakavimas (unboxing)
int išpakotasReikšmė = (int)nuorodaTipas; // nuorodaTipas išpakavamas į int
Kapsuliavimą ir išpakavimą galima išvengti naudojant generikus. Generiniai sąrašai ir metodai dirba tiesiogiai su reikšmės tipais, nereikalaujant jų konvertavimo į object. Tai pagerina našumą ir tipų saugumą.
Pavyzdys su generikais:
// Naudojant List<T> vietoj ArrayList
using System.Collections.Generic;
List<int> generinisSarasas = new List<int>();
generinisSarasas.Add(10); // Be kapsuliavimo
int reikšmė = generinisSarasas[0]; // Be išpakavimo
Generikų naudojimas užkerta kelią atminties paskirstymo ir duomenų kopijavimo išlaidoms kapsuliavimo/išpakavimo metu, taip pat išvengia tipų klaidų vykdymo metu.