Unsafe.As Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
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 |
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
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
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 0x1234
vý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í").