Unsafe.As Метод

Определение

Перегрузки

Имя Описание
As<T>(Object)

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

As<TFrom,TTo>(TFrom)

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

As<T>(Object)

Исходный код:
Unsafe.cs
Исходный код:
Unsafe.cs
Исходный код:
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
Исходный код:
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) 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

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

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, Sec. I.12.6.2 ("Выравнивание").

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