Поделиться через


Unsafe.As Метод

Определение

Перегрузки

As<T>(Object)

Приводит заданный объект к указанному типу.

As<TFrom,TTo>(TFrom)

Повторно интерпретирует данный управляемый указатель как новый управляемый указатель на значение типа TTo.

As<T>(Object)

Исходный код:
Unsafe.cs
Исходный код:
Unsafe.cs
Исходный код:
Unsafe.cs

Приводит заданный объект к указанному типу.

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

Параметры типа

T

Тип, к которому будет приведен объект .

Параметры

o
Object

Объект для приведения.

Возвращаемое значение

T

Исходный объект, приводимый к заданному типу.

Комментарии

Этот API используется для приведения объекта к заданному типу, подавляя обычные проверки безопасности типа среды выполнения. Ответственность абонента заключается в том, чтобы убедиться, что приведение является законным. Нет InvalidCastException будет брошено.

Поведение Unsafe.As<T>(o) хорошо определено только в том случае, если типичная "безопасная" операция (T)o приведения была бы успешной. Использование этого API для обхода приведения, которое в противном случае завершилось бы сбоем, не поддерживается и может привести к нестабильной работе среды выполнения.

Чтобы обеспечить правильное использование, разработчики могут использовать в коде стандартное приведение или утверждение только для отладки, как показано в следующих примерах.

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

Применяется к

As<TFrom,TTo>(TFrom)

Исходный код:
Unsafe.cs
Исходный код:
Unsafe.cs
Исходный код:
Unsafe.cs

Повторно интерпретирует данный управляемый указатель как новый управляемый указатель на значение типа 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

Параметры типа

TFrom

Тип управляемого указателя для повторного интерпретации.

TTo

Требуемый тип управляемого указателя.

Параметры

source
TFrom

Управляемый указатель для повторного интерпретации.

Возвращаемое значение

TTo

Управляемый указатель на значение типа TTo.

Комментарии

Этот API концептуально похож на C++ reinterpret_cast<>. Ответственность абонента заключается в том, чтобы убедиться, что приведение является законным. Проверка среды выполнения выполняться не будет.

Повторно интерпретируется только управляемый указатель. Само указанное значение останется без изменений. Рассмотрим следующий пример.

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

Выходные данные этой программы зависят от эндианности текущего компьютера. В архитектурах с большим эндианом этот код выводит 0x1234. В архитектурах с маленьким эндианом этот код выводит 0x5678.

При приведении управляемого указателя к более узкому типу вызывающий объект должен убедиться, что разыменовывание указателя не приведет к доступу за пределы границ. Вызывающий объект также отвечает за правильное выравнивание результирующего указателя для указанного типа. Дополнительные сведения о допущениях выравнивания см. в разделе ECMA-335, сек. I.12.6.2 ("Выравнивание").

Применяется к