Unsafe.SkipInit<T>(T) Methode
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
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.