Unsafe.SkipInit<T>(T) Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Pomija określone reguły przypisania dla danego odwołania.
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)
Parametry typu
- T
Typ odwołania.
Parametry
- value
- T
Odwołanie, którego inicjowanie powinno zostać pominięte.
Uwagi
Ta metoda jest zwykle używana do unikania podwójnego inicjowania podczas inicjowania struktur typu unii. Rozważmy poniższy przykład, który generuje błąd kompilatora języka 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;
}
Ten błąd występuje, ponieważ kompilator oczekuje, że wszystkie pola struktury zostaną zainicjowane, zanim struktura zostanie użyta lub zwrócona do obiektu wywołującego.
Jednym ze sposobów uniknięcia tego błędu kompilatora jest upewnienie się, że cała struktura jest zerowa przed ustawieniem poszczególnych pól, jak pokazano w poniższym przykładzie.
// This sample compiles successfully.
public static MyUnionStruct MyMethod() {
MyUnionStruct value = default; // the struct is now guaranteed assigned
value.SomeIntField = 42;
return value;
}
Jeśli chcesz uniknąć początkowej inicjalizacji zerowej, możesz wywołać metodę , aby pominąć SkipInit ostrzeżenie kompilatora.
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;
}
Ostrzeżenie
Upewnij się, że struktura została zainicjowana odpowiednio, w przeciwnym razie pola struktury mogą zawierać niezainicjowane dane ze stosu.