Unsafe.SkipInit<T>(T) Método
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Ignora regras de atribuição definitivas para uma determinada referência.
public:
generic <typename T>
static void SkipInit([Runtime::InteropServices::Out] T % value);
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
- T
O tipo da referência.
Parâmetros
- value
- T
A referência cuja inicialização deve ser ignorada.
Comentários
Esse método normalmente é usado para evitar a inicialização dupla ao inicializar structs do tipo união. Considere o exemplo a seguir, que produz um erro do 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;
}
Esse erro ocorre porque o compilador espera que todos os campos do struct sejam inicializados antes que o struct seja usado ou retornado ao chamador.
Uma maneira de evitar esse erro do compilador é garantir que todo o struct seja inicializado sem inicialização antes que campos individuais sejam definidos, conforme mostrado no exemplo a seguir.
// 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 zero inicial, você pode chamar o SkipInit
método pode ser usado 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;
}
Aviso
Tome cuidado para garantir que o struct tenha sido inicializado adequadamente, caso contrário, os campos do struct podem conter dados não inicializados da pilha.