Unsafe.SkipInit<T>(T) Metod

Definition

Kringgår bestämda tilldelningsregler för en viss referens.

public:
generic <typename T>
 static void SkipInit([Runtime::InteropServices::Out] T % value);
public static void SkipInit<T>(out T value) where T : allows ref struct;
public static void SkipInit<T>(out T value);
static member SkipInit : 'T -> unit
Public Shared Sub SkipInit(Of T) (ByRef value As T)

Typparametrar

T

Typen av referens.

Parametrar

value
T

Referensen vars initiering ska hoppas över.

Kommentarer

Den här metoden används vanligtvis för att undvika dubbelinitiering vid initiering av structs av union-typ. Tänk på följande exempel som genererar ett C#-kompilatorfel.

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

Det här felet beror på att kompilatorn förväntar sig att alla fält i struct initieras innan struct används eller returneras till anroparen.

Ett sätt att undvika det här kompilatorfelet är att se till att hela structen är nollinitierad innan enskilda fält anges, enligt följande exempel.

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

Om du vill undvika den inledande nollinitieringen kan du anropa SkipInit metoden för att ignorera kompilatorvarningen.

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

Varning

Se till att structen har initierats på rätt sätt, annars kan struct-fälten innehålla oinitierade data från stacken.

Gäller för