Share via


Unsafe.SkipInit<T>(T) Methode

Definition

Umgeht bestimmte Zuweisungsregeln für einen bestimmten Verweis.

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)

Typparameter

T

Der Typ des Verweises.

Parameter

value
T

Der Verweis, dessen Initialisierung übersprungen werden soll.

Hinweise

Diese Methode wird in der Regel verwendet, um doppelte Initialisierungen beim Initialisieren von Strukturen vom Typ Union zu vermeiden. Sehen Sie sich das folgende Beispiel an, das einen C#-Compilerfehler erzeugt.

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

Dieser Fehler tritt auf, weil der Compiler erwartet, dass alle Felder der Struktur initialisiert werden, bevor die Struktur verwendet oder an den Aufrufer zurückgegeben wird.

Eine Möglichkeit, diesen Compilerfehler zu vermeiden, besteht darin, sicherzustellen, dass die gesamte Struktur null initialisiert wird, bevor einzelne Felder festgelegt werden, wie im folgenden Beispiel gezeigt.

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

Wenn Sie die anfängliche Nullinitialisierung vermeiden möchten, können Sie die SkipInit -Methode aufrufen, um die Compilerwarnung zu unterdrücken.

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

Warnung

Achten Sie darauf, dass die Struktur ordnungsgemäß initialisiert wurde. Andernfalls könnten die Felder der Struktur nicht initialisierte Daten aus dem Stapel enthalten.

Gilt für: