Unsafe.As Método
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Sobrecargas
| Name | Description |
|---|---|
| As<T>(Object) |
Conjura o objeto dado para o tipo especificado. |
| As<TFrom,TTo>(TFrom) |
Reinterpreta o ponteiro gerido dado como um novo apontador gerido para um valor do tipo |
As<T>(Object)
- Origem:
- Unsafe.cs
- Origem:
- Unsafe.cs
- Origem:
- Unsafe.cs
- Origem:
- Unsafe.cs
- Origem:
- Unsafe.cs
Conjura o objeto dado para o 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 Genérico
- T
O tipo para o qual o objeto será lançado.
Parâmetros
- o
- Object
O objeto a lançar.
Devoluções
O objeto original, fundido para o tipo dado.
Observações
Esta API é usada para lançar um objeto para o tipo dado, suprimindo as verificações normais de segurança do tipo em tempo de execução. É responsabilidade do ouvinte garantir que o elenco é legal. Não InvalidCastException será lançado.
O comportamento de Unsafe.As<T>(o) só está bem definido se a operação (T)o típica de fundição "segura" tivesse tido sucesso. A utilização desta API para contornar casts que de outra forma teriam falhado não é suportada e pode resultar em instabilidade em tempo de execução.
Para ajudar a impor o uso correto, os programadores podem considerar usar um cast padrão ou uma assertion apenas de depuração no seu código, como mostrado nos exemplos seguintes.
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
- Origem:
- Unsafe.cs
- Origem:
- Unsafe.cs
Reinterpreta o ponteiro gerido dado como um novo apontador gerido 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) 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
Parâmetros de Tipo Genérico
- TFrom
O tipo de ponteiro gerido para reinterpretar.
- TTo
O tipo desejado do ponteiro gerido.
Parâmetros
- source
- TFrom
O ponteiro conseguido para reinterpretar.
Devoluções
Um apontador gerido para um valor do tipo TTo.
Observações
Esta API é conceptualmente semelhante à reinterpret_cast<>de C++ . É responsabilidade do ouvinte garantir que o elenco é legal. Não será realizada qualquer verificação em tempo de execução.
Apenas o ponteiro gerido é reinterpretado. O valor referenciado 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 da máquina atual. Em arquiteturas big-endian, este código produz 0x1234. Em arquiteturas little-endian, este código gera 0x5678.
Ao lançar um ponteiro gerido de um tipo mais estreito para um tipo mais largo, o chamador deve garantir que a desreferenciação do ponteiro não causará um acesso fora dos limites. O chamador é também responsável por garantir que o ponteiro resultante está corretamente alinhado para o tipo referenciado. Para mais informações sobre pressupostos de alinhamento, consulte ECMA-335, Sec. I.12.6.2 ("Alinhamento").