Unsafe.As Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Przeciążenia
As<T>(Object) |
Rzutuje dany obiekt do określonego typu. |
As<TFrom,TTo>(TFrom) |
Ponownie interpretuje dany wskaźnik zarządzany jako nowy wskaźnik zarządzany do wartości typu |
As<T>(Object)
- Źródło:
- Unsafe.cs
- Źródło:
- Unsafe.cs
- Źródło:
- Unsafe.cs
Rzutuje dany obiekt do określonego typu.
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, do którego będzie rzutowy obiekt.
Parametry
- o
- Object
Obiekt do rzutowania.
Zwraca
Oryginalny obiekt rzutowania do danego typu.
Uwagi
Ten interfejs API służy do rzutowania obiektu do danego typu, pomijając normalne kontrole bezpieczeństwa typu środowiska uruchomieniowego. Jest to odpowiedzialność rozmówcy za zapewnienie, że obsada jest legalna. Nie InvalidCastException
zostanie zgłoszony.
Zachowanie jest Unsafe.As<T>(o)
dobrze zdefiniowane tylko wtedy, gdy typowa "bezpieczna" operacja (T)o
rzutowania powiodłaby się. Użyj tego interfejsu API, aby obejść rzutowania, które w przeciwnym razie nie powiodły się, jest nieobsługiwane i może spowodować niestabilność środowiska uruchomieniowego.
Aby ułatwić wymuszanie poprawnego użycia, deweloperzy mogą rozważyć użycie standardowego rzutowania lub potwierdzenia tylko do debugowania w kodzie, jak pokazano w poniższych przykładach.
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);
}
Dotyczy
As<TFrom,TTo>(TFrom)
- Źródło:
- Unsafe.cs
- Źródło:
- Unsafe.cs
- Źródło:
- Unsafe.cs
Ponownie interpretuje dany wskaźnik zarządzany jako nowy wskaźnik zarządzany do wartości 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 zarządzanego wskaźnika do ponownego zinterpretowania.
- TTo
Żądany typ zarządzanego wskaźnika.
Parametry
- source
- TFrom
Zarządzany wskaźnik do ponownego zinterpretowania.
Zwraca
Zarządzany wskaźnik do wartości typu TTo
.
Uwagi
Ten interfejs API jest koncepcyjnie podobny do języka C++.reinterpret_cast<>
Jest to odpowiedzialność rozmówcy za zapewnienie, że obsada jest legalna. Nie zostanie wykonane sprawdzanie środowiska uruchomieniowego.
Tylko zarządzany wskaźnik jest ponownie interpretowany. Sama przywołyna wartość pozostanie niezmieniona. Rozważmy następujący przykład.
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}");
Dane wyjściowe tego programu zależą od endianness bieżącej maszyny. W przypadku architektur big-endian ten kod generuje dane wyjściowe 0x1234
. W przypadku architektur mało endińskich ten kod generuje dane wyjściowe 0x5678
.
Podczas rzutowania zarządzanego wskaźnika z węższego typu do szerszego typu obiekt wywołujący musi upewnić się, że wyłudzanie wskaźnika nie spowoduje przekroczenia limitu dostępu. Obiekt wywołujący jest również odpowiedzialny za upewnienie się, że wynikowy wskaźnik jest prawidłowo wyrównany do typu przywoływanego. Aby uzyskać więcej informacji na temat założeń dotyczących wyrównania, zobacz ECMA-335, Sec. I.12.6.2 ("Wyrównanie").