Compartilhar via


Unsafe.SkipInit<T>(T) Método

Definição

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.

Aplica-se a