Unsafe.SkipInit<T>(T) 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.
Ignora regras de atribuição definidas para uma dada referência.
public:
generic <typename T>
static void SkipInit([Runtime::InteropServices::Out] T % value);
public static void SkipInit<T>(out T value) where T : allows ref struct;
public static void SkipInit<T>(out T value);
static member SkipInit : 'T -> unit
Public Shared Sub SkipInit(Of T) (ByRef value As T)
Parâmetros de Tipo Genérico
- T
O tipo de referência.
Parâmetros
- value
- T
A referência cuja inicialização deve ser ignorada.
Observações
Este método é tipicamente usado para evitar a dupla inicialização ao inicializar estruturas do tipo union. Considere o seguinte exemplo, que produz um erro no compilador C#.
using System;
using System.Runtime.InteropServices;
public static MyUnionStruct MyMethod() {
MyUnionStruct value;
value.SomeIntField = 42;
return value; // CS0165: Use of unassigned local variable 'value'
}
[StructLayout(LayoutKind.Explicit)]
public struct MyUnionStruct
{
[FieldOffset(0)]
public int SomeIntField;
[FieldOffset(0)]
public byte SomeByteField;
}
Este erro ocorre porque o compilador espera que todos os campos do struct sejam inicializados antes de o struct ser usado ou devolvido ao chamador.
Uma forma de evitar este erro do compilador é garantir que toda a estrutura está inicializada a zero antes de os campos individuais serem definidos, como mostrado no exemplo seguinte.
// This sample compiles successfully.
public static MyUnionStruct MyMethod() {
MyUnionStruct value = default; // the struct is now guaranteed assigned
value.SomeIntField = 42;
return value;
}
Se quiser evitar a inicialização inicial zero, pode chamar o SkipInit método para suprimir o aviso do compilador.
using System.Runtime.CompilerServices;
// This sample also compiles successfully.
public static MyUnionStruct MyMethod() {
MyUnionStruct value;
Unsafe.SkipInit(out value); // compiler believes the struct has been guaranteed assigned
value.SomeIntField = 42;
return value;
}
Warning
Certifique-se de garantir que a estrutura foi inicializada corretamente, caso contrário os campos da estrutura poderiam conter dados não inicializados da pilha.