Udostępnij za pośrednictwem


Unsafe.Unbox<T>(Object) Metoda

Definicja

mutable ref Zwraca wartość do wartości pola.

public:
generic <typename T>
 where T : value class static T % Unbox(System::Object ^ box);
public static ref T Unbox<T> (object box) where T : struct;
static member Unbox : obj -> 'T (requires 'T : struct)
Public Shared Function Unbox(Of T As Structure) (box As Object) As T

Parametry typu

T

Typ, który ma być rozpakowany.

Parametry

box
Object

Wartość do rozpalokowania.

Zwraca

T

A mutable ref do wartości boxpola .

Wyjątki

box to null, a T jest typem wartości innej niż null.

box nie jest typem wartości pola.

-lub-

box nie jest boxed T.

T nie można odnaleźć.

Uwagi

Metoda Unbox<T> jest po prostu otoką instrukcji unbox IL. Jest to przydatne jako optymalizacja wydajności. Za każdym razem, gdy interfejs API, który wymaga Object wielokrotnego wywołania z różnymi wartościami typu wartości, tego samego obiektu pola można użyć ponownie, a nie nowego utworzonego za każdym razem.

Metoda Unbox<T> ma ważne ograniczenie użycia, które nie jest wymuszane przez kompilatory języka i jest to odpowiedzialność obiektu wywołującego. Instrukcja IL unbox zwraca kontrolowany wskaźnik zarządzany przez niezmienność. Ponieważ kompilatory języków .NET i .NET nie mogą reprezentować tego ograniczenia, Unbox<T> metoda zwraca normalny modyfikowalny ref Telement . Jednak deweloperzy nie mogą modyfikować zwróconego odwołania, chyba że są pewni, że T jest to modyfikowalny typ struktury. Na przykład ponieważ typy pierwotne liczbowe, takie jak Int32 nie są modyfikowalnymi typami struktury, następujący kod nie jest obsługiwany:

// The following line is NOT SUPPORTED.
Unsafe.Unbox<int>(obj) = 30;

Z kolei typ, taki jak Point jest modyfikowalny, struktura z zestawami właściwości publicznych, więcmutowanie wartości pola przez wywołanie metod ustawiających właściwości jest obsługiwane:

// The following lines are legal and supported.
Unsafe.Unbox<System.Drawing.Point>(obj).X = 50;
Unsafe.Unbox<System.Drawing.Point>(obj).Y = 70;

Jednak zastąpienie całej hurtowni referencyjnej nie jest obsługiwane, nawet jeśli odwołanie dotyczy modyfikowalnego typu struktury.

// Resetting the reference to default(T) is NOT SUPPORTED.
Unsafe.Unbox<System.Drawing.Point>(obj) = default(System.Drawing.Point);

// Setting the reference to a completely new value is NOT SUPPORTED.
Unsafe.Unbox<System.Drawing.Point>(obj) = new System.Drawing.Point(50, 70);

Aby uzyskać więcej informacji, w tym szczegółowe omówienie ograniczeń użycia tej instrukcji, zobacz sekcje III.1.8.1.2.2 ("Controlled-mutability managed pointers") i III.4.32 ("unbox -- convert boxed value type to its raw form") in ECMA-335: Common Language Infrastructure (CLI).

Dotyczy