Unsafe.As Metod

Definition

Överlagringar

Name Description
As<T>(Object)

Omvandlar det angivna objektet till den angivna typen.

As<TFrom,TTo>(TFrom)

Omtolkar den angivna hanterade pekaren som en ny hanterad pekare till ett värde av typen TTo.

As<T>(Object)

Källa:
Unsafe.cs
Källa:
Unsafe.cs
Källa:
Unsafe.cs
Källa:
Unsafe.cs
Källa:
Unsafe.cs

Omvandlar det angivna objektet till den angivna typen.

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

Typparametrar

T

Den typ som objektet ska gjutas till.

Parametrar

o
Object

Objektet som ska gjutas.

Returer

T

Det ursprungliga objektet, gjutet till den angivna typen.

Kommentarer

Det här API:et används för att omvandla ett objekt till den angivna typen, vilket undertrycker körningens normala typsäkerhetskontroller. Det är uppringarens ansvar att se till att skådespelarna är lagliga. Nej InvalidCastException kommer att kastas.

Beteendet Unsafe.As<T>(o) för är bara väldefinierat om den typiska "säkra" gjutningsåtgärden (T)o skulle ha lyckats. Användning av det här API:et för att kringgå avbildningar som annars skulle ha misslyckats stöds inte och kan leda till instabilitet i körningen.

För att säkerställa korrekt användning kan utvecklare överväga att använda en standardutgjutning eller en kontroll med endast felsökning i sin kod, enligt följande exempel.

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);
}

Gäller för

As<TFrom,TTo>(TFrom)

Källa:
Unsafe.cs
Källa:
Unsafe.cs
Källa:
Unsafe.cs
Källa:
Unsafe.cs
Källa:
Unsafe.cs

Omtolkar den angivna hanterade pekaren som en ny hanterad pekare till ett värde av typen TTo.

public:
generic <typename TFrom, typename TTo>
 static TTo % As(TFrom % source);
public static ref TTo As<TFrom,TTo>(ref TFrom source) where TFrom : allows ref struct where TTo : allows ref struct;
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

Typparametrar

TFrom

Den typ av hanterad pekare som ska omtolkas.

TTo

Önskad typ av hanterad pekare.

Parametrar

source
TFrom

Den hanterade pekaren som ska omtolkas.

Returer

TTo

En hanterad pekare till ett värde av typen TTo.

Kommentarer

Det här API:et liknar konceptuellt C++:s reinterpret_cast<>. Det är uppringarens ansvar att se till att skådespelarna är lagliga. Ingen körningskontroll utförs.

Endast den hanterade pekaren omtolkas. Själva det refererade värdet förblir oförändrat. Tänk dig följande exempel.

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}");

Programmets utdata beror på den aktuella datorns endianitet. I stor endianska arkitekturer matar den här koden ut 0x1234. I lite endianska arkitekturer matar den här koden ut 0x5678.

När du kastar en hanterad pekare från en smalare typ till en bredare typ, måste anroparen se till att dereferencing pekaren inte kommer att medföra en out-of-bounds-åtkomst. Anroparen ansvarar också för att säkerställa att den resulterande pekaren är korrekt justerad för den refererade typen. Mer information om anpassningsantaganden finns i ECMA-335, sek. I.12.6.2 ("Justering").

Gäller för