Udostępnij za pośrednictwem


Unsafe.As Metoda

Definicja

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 TTo.

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

T

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

TTo

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").

Dotyczy