Compartir vía


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

Definición

Omite las reglas de asignación definitivas para una referencia determinada.

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

Tipo de la referencia.

Parámetros

value
T

Referencia cuya inicialización se debe omitir.

Comentarios

Este método se usa normalmente para evitar la inicialización doble al inicializar estructuras de tipo de unión. Considere el ejemplo siguiente, que genera un error del compilador de 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 error se produce porque el compilador espera que se inicialicen todos los campos de la estructura antes de que se use o se devuelva al autor de la llamada.

Una manera de evitar este error del compilador es asegurarse de que toda la estructura se inicializa sin inicializar antes de que se establezcan campos individuales, como se muestra en el ejemplo siguiente.

// This sample compiles successfully.
public static MyUnionStruct MyMethod() {
    MyUnionStruct value = default; // the struct is now guaranteed assigned
    value.SomeIntField = 42;
    return value;
}

Si desea evitar la inicialización cero inicial, puede llamar al SkipInit método para suprimir la advertencia del 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;
}

Advertencia

Tenga cuidado de asegurarse de que la estructura se ha inicializado correctamente; de lo contrario, los campos de la estructura podrían contener datos no inicializados de la pila.

Se aplica a