Partilhar via


Unsafe.As Método

Definição

Sobrecargas

As<T>(Object)

Converte o objeto fornecido no tipo especificado.

As<TFrom,TTo>(TFrom)

Reinterpreta o ponteiro gerenciado fornecido como um novo ponteiro gerenciado para um valor do tipo TTo.

As<T>(Object)

Origem:
Unsafe.cs
Origem:
Unsafe.cs
Origem:
Unsafe.cs

Converte o objeto fornecido no tipo especificado.

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

Parâmetros de tipo

T

O tipo no qual o objeto será convertido.

Parâmetros

o
Object

O objeto a ser convertido.

Retornos

T

O objeto original, convertido no tipo fornecido.

Comentários

Essa API é usada para converter um objeto para o tipo fornecido, suprimindo as verificações de segurança de tipo normais do runtime. É responsabilidade do chamador garantir que o elenco seja legal. Não InvalidCastException será lançado.

O comportamento de Unsafe.As<T>(o) só será bem definido se a operação (T)o típica de conversão "segura" tivesse sido bem-sucedida. O uso dessa API para contornar conversões que de outra forma teriam falhado não tem suporte e pode resultar em instabilidade de runtime.

Para ajudar a impor o uso correto, os desenvolvedores podem considerar o uso de uma conversão padrão ou uma declaração somente de depuração em seu código, conforme mostrado nos exemplos a seguir.

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

Aplica-se a

As<TFrom,TTo>(TFrom)

Origem:
Unsafe.cs
Origem:
Unsafe.cs
Origem:
Unsafe.cs

Reinterpreta o ponteiro gerenciado fornecido como um novo ponteiro gerenciado para um valor do tipo 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

Parâmetros de tipo

TFrom

O tipo de ponteiro gerenciado a ser reinterpreto.

TTo

O tipo desejado do ponteiro gerenciado.

Parâmetros

source
TFrom

O ponteiro gerenciado para reinterpretar.

Retornos

TTo

Um ponteiro gerenciado para um valor do tipo TTo.

Comentários

Essa API é conceitualmente semelhante à do reinterpret_cast<>C++. É responsabilidade do chamador garantir que o elenco seja legal. Nenhuma marcar de runtime será executada.

Somente o ponteiro gerenciado é reinterpretado. O valor referenciado em si permanecerá inalterado. Considere o exemplo a seguir.

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

A saída deste programa depende da endianidade do computador atual. Em arquiteturas big-endian, esse código gera 0x1234. Em arquiteturas little-endian, esse código gera 0x5678.

Ao converter um ponteiro gerenciado de um tipo mais estreito para um tipo mais amplo, o chamador deve garantir que a desreferência do ponteiro não incorra em um acesso fora dos limites. O chamador também é responsável por garantir que o ponteiro resultante esteja alinhado corretamente para o tipo referenciado. Para obter mais informações sobre suposições de alinhamento, consulte ECMA-335, S. I.12.6.2 ("Alinhamento").

Aplica-se a