Opakowywanie typów

Adam Boduch

Boksowanie typów to pojęcie związane z programowaniem obiektowym w .NET.

W .NET Framework, w wielu przypadkach metody wymagają podania parametru typu System.Object. Przykładowo, utwórzmy nowy projekt WinForms i umieśćmy na formularzu komponent ListBox, a także przycisk Button. Zadaniem programu będzie umieszczanie elementów na liście ListBox po naciśnięciu przycisku. Klasa ListBox posiada właściwość Items, która służy do zarządzania elementami na liście. Nowy element można dodać wywołując metodę Add, w następujący sposób:

ListBox1.Items.Add();

Oczywiście w nawiasie należy podać wartość, która zostanie dodana do listy. Metoda Add posiada parametr, który jest typu System.Object. Aby dodać wartość tekstową, należy skorzystać z mechanizmu boksowania:

procedure TWinForm2.Button2_Click(sender: System.Object; e: System.EventArgs);
begin
  ListBox1.Items.Add(System.&Object('Delphi jest fajne'));
end;

Po uruchomieniu programu i naciśnięciu przycisku, do listy zostanie dodany nowy element.

Boksowanie jest techniką pozwalającą na konwersję pewnych danych na typ System.Object.

.NET Framework umożliwia także operację odwrotną ? warto przeanalizować poniższy przykład:

procedure TWinForm2.Button2_Click(sender: System.Object; e: System.EventArgs);
type
  TPoint = packed record
    X, Y : Integer;
  end;

var
  P : TPoint;
  O : System.Object;
begin
  P.X := 1;
  P.Y := 2;

  { pakowanie (boksowanie) }
  O := System.Object(P);

  { odpakowywanie }
  P := TPoint(O);

  MessageBox.Show('Wartość X: ' + Convert.ToString(P.X));
end;

Zadeklarowałem rekord o nazwie TPoint oraz zmienną P, wskazującą na ten rekord. Po przydzieleniu danych do tego rekordu, zastosowałem boksowanie, aby dokonać konwersji danych do typu System.Object. Później zastosowałem operację odwrotną ? rzutowanie na typ TPoint.

Zobacz też:

5 komentarzy

Zmieniłem nazwę, pozmieniałem linki w innych artykułach. Bez przekierowania [ustalone na gg]

Zdecydowanie popieram Koobę - boksować to się można na ringu.

A co do przykładu - nieco niefortunny chyba? Czy to tylko ograniczenie [kolejne] Delphi?
W C# mogę napisać:

ListBox1.Items.Add("C# jest fajny");

To wymaga uściślenia!

Boksowanie typów? :|

imho lepiej brzmi tłumaczenie: Opakowywanie (tak to przetłumaczył Stanisław Piech w książce "Programowanie w języku C#" Erica Gunnersona), bo boksowanie to tak troche po polskiemu :P

gdyby ktos nie wiedział to po angielsku to jest boxing i unboxing

LOL, wchodzac, mialem wrazenie, ze dowiem sie jak pobic (naboksowac) jakiegos typa :D

Mi to rybka - mozna zmienic. Ale z ustawieniem przekierowania, aby linki ktore prowadza do tej strony - dzialaly.