Unsafe.SkipInit<T>(T) Metodo

Definizione

Ignora le regole di assegnazione definite per un determinato riferimento.

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)

Parametri di tipo

T

Tipo del riferimento.

Parametri

value
T

Riferimento di cui ignorare l'inizializzazione.

Commenti

Questo metodo viene in genere usato per evitare l'inizializzazione doppia durante l'inizializzazione di struct di tipo unione. Si consideri l'esempio seguente, che genera un errore del compilatore 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;
}

Questo errore si verifica perché il compilatore prevede che tutti i campi dello struct vengano inizializzati prima che venga usato o restituito al chiamante.

Un modo per evitare questo errore del compilatore consiste nel garantire che l'intero struct sia inizializzato zero prima che vengano impostati i singoli campi, come illustrato nell'esempio seguente.

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

Se si desidera evitare l'inizializzazione iniziale zero, è possibile chiamare il SkipInit metodo per eliminare l'avviso del compilatore.

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;
}

Avviso

Assicurarsi che lo struct sia stato inizializzato in modo appropriato. In caso contrario, i campi dello struct potrebbero contenere dati non inizializzati dallo stack.

Si applica a