Unsafe.As Metod
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Ö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 |
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
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
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").