Unsafe.As Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Перегрузки
As<T>(Object) |
Приводит заданный объект к указанному типу. |
As<TFrom,TTo>(TFrom) |
Повторно интерпретирует данный управляемый указатель как новый управляемый указатель на значение типа |
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
Объект для приведения.
Возвращаемое значение
Исходный объект, приводимый к заданному типу.
Комментарии
Этот 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
.
Комментарии
Этот 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 ("Выравнивание").