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