[C#] Despre boxing și unboxing

Ce sunt boxing și unboxing?

string s = "test";

object obj = s; // boxing, nu trebuie folosit cast-ul

string str = (string)obj; // unboxing, trebuie folosit cast-ul

De ce se folosesc?

object este un tip-referință, string este un tip-valoare. În unele locuri e nevoie de folosirea unui tip-referință și nu a unui tip-valoare (când trebuie să apelezi o metodă care folosește metoda ToString a unui parametru de tip object sau o subclasă a object). Atunci e posibilă introducerea unei variabile de tip-valoare într-o variabilă de tip-referință. Și variabilele de tipuri-referință, și cele de tipuri-valoare se pot inițializa cu operatorul new când tipul respectiv are un constructor accesibil.

Ce este un tip-valoare?

int x = 5;
int y = 5;
Console.WriteLine(x == y); // Adevărat (True) pentru că valoarea lui y este o copie a valorii lui x, și se testează doar egalitatea valorilor, nu a adreselor de memorie ale variabilelor.

Tipurile-valoare se creează cu cuv. cheie struct. Documentație oficială în acest link [EN].

Ce este un tip-referință?

object a = 5;
object b = 5;
Console.WriteLine(a == b); // Fals (False) pentru că a și b sunt indicatori ai unei singure valori, 5, dar a face trimitere la a, și b face trimitere la b. Se compară adresele din memorie ale variabilelor.

Tipurile-referință se creează cu cuv. cheie class. Documentație oficială în acest link [EN].

Exemplu

using System;
using System.Windows.Forms;

namespace cs_boxing_unboxing
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            string s = "test";
            object obj = s; // boxing, nu trebuie folosit cast-ul
            string str = (string)obj; // unboxing, trebuie folosit cast-ul
            Console.WriteLine(str);

            int x = 5;
            int y = 5;
            Console.WriteLine(x == y); // Adevărat (True) pentru că valoarea lui y este o copie a valorii lui x, și se testează doar egalitatea valorilor, nu a adreselor de memorie ale variabilelor.

            object a = 5;
            object b = 5;
            Console.WriteLine(a == b); // Fals (False) pentru că a și b sunt indicatori ai unei singure valori, 5, dar a face trimitere la a, și b face trimitere la b. Se compară adresele din memorie ale variabilelor.
        }
    }
}

Capturi de ecran


La rularea programului, se afișează:

 

Niciun comentariu:

Trimiteți un comentariu