Unsafe.As Metoda

Definice

Přetížení

As<T>(Object)

Přetypuje daný objekt na zadaný typ.

As<TFrom,TTo>(TFrom)

Reinterpretuje daný spravovaný ukazatel jako nový spravovaný ukazatel na hodnotu typu TTo.

As<T>(Object)

Zdroj:
Unsafe.cs
Zdroj:
Unsafe.cs
Zdroj:
Unsafe.cs

Přetypuje daný objekt na zadaný typ.

public:
generic <typename T>
 where T : class static T As(System::Object ^ o);
public static T As<T> (object o) where T : class;
public static T? As<T> (object? o) where T : class;
static member As : obj -> 'T (requires 'T : null)
Public Shared Function As(Of T As Class) (o As Object) As T

Parametry typu

T

Typ, na který bude objekt přetypován.

Parametry

o
Object

Objekt, který se má přetypovat.

Návraty

T

Původní objekt přetypován na daný typ.

Poznámky

Toto rozhraní API se používá k přetypování objektu na daný typ a potlačuje normální bezpečnostní kontroly typů za běhu. Je na volajícím, aby zajistil, že přetypování je legální. Ne InvalidCastException bude vhozeno.

Chování Unsafe.As<T>(o) je dobře definováno pouze v případě, že by typická "bezpečná" operace (T)o přetypování byla úspěšná. Použití tohoto rozhraní API k obcházení přetypování, která by jinak selhala, není podporováno a mohlo by vést k nestabilitě modulu runtime.

Aby vývojáři mohli vynutit správné použití, můžou zvážit použití standardního přetypování nebo kontrolního příkazu jen pro ladění ve svém kódu, jak je znázorněno v následujících příkladech.

void ReinterpretCastAndUse_Sample1(object o)
{
  // Assume that we know through some other means that 'o' is a string,
  // and we want our library's debug builds to verify this.
  // One way to do this is through a standard-style cast.
  // A standard-style cast will throw InvalidCastException at runtime if the cast fails.
  // n.b. Casts of null objects to reference types will succeed.

#if DEBUG
  string s = (string)o;
#else
  string s = Unsafe.As<string>(o);
#endif

  DoSomethingWith(s);
}

void ReinterpretCastAndUse_Sample2(object o)
{
  // Another way to check this is through a debug-only assert.
  // Failed assertions will trigger attached debuggers or terminate the application immediately.
  // Calls to Debug.Assert are removed from release builds.

  Debug.Assert(o is null or string, "Unsafe.As call below is illegal!");
  string s = Unsafe.As<string>(o);

  DoSomethingWith(s);
}

Platí pro

As<TFrom,TTo>(TFrom)

Zdroj:
Unsafe.cs
Zdroj:
Unsafe.cs
Zdroj:
Unsafe.cs

Reinterpretuje daný spravovaný ukazatel jako nový spravovaný ukazatel na hodnotu typu TTo.

public:
generic <typename TFrom, typename TTo>
 static TTo % As(TFrom % source);
public static ref TTo As<TFrom,TTo> (ref TFrom source);
static member As : 'From -> 'o
Public Shared Function As(Of TFrom, TTo) (ByRef source As TFrom) As TTo

Parametry typu

TFrom

Typ spravovaného ukazatele, který má být reinterpretován.

TTo

Požadovaný typ spravovaného ukazatele.

Parametry

source
TFrom

Spravovaný ukazatel, který se má reinterpretovat.

Návraty

TTo

Spravovaný ukazatel na hodnotu typu TTo.

Poznámky

Toto rozhraní API je koncepčně podobné rozhraní C++ reinterpret_cast<>. Je na volajícím, aby zajistil, že přetypování je legální. Nebude provedena žádná kontrola modulu runtime.

Pouze spravovaný ukazatel je znovu interpretován. Samotná odkazovaná hodnota zůstane beze změny. Představte si následující příklad.

int[] intArray = new int[] { 0x1234_5678 }; // a 1-element array
ref int refToInt32 = ref intArray[0]; // managed pointer to first Int32 in array
ref short refToInt16 = ref Unsafe.As<int, short>(ref refToInt32); // reinterpret as managed pointer to Int16
Console.WriteLine($"0x{refToInt16:x4}");

Výstup tohoto programu závisí na endiálnosti aktuálního počítače. Na architekturách big-endian tento kód vypíše 0x1234výstup . V architekturách little-endian tento kód vypíše 0x5678.

Při přetypování spravovaného ukazatele z užšího typu na širší typ musí volající zajistit, aby při přesouvání ukazatele nedošlo k přístupu mimo rozsah. Volající je také zodpovědný za zajištění toho, aby byl výsledný ukazatel správně zarovnán pro odkazovaný typ. Další informace o předpokladech zarovnání najdete v tématu ECMA-335, s. I.12.6.2 ("Zarovnání").

Platí pro