Sdílet prostřednictvím


Unsafe.SkipInit<T>(T) Metoda

Definice

Obchází určitá pravidla přiřazení pro daný odkaz.

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 odkazu.

Parametry

value
T

Odkaz, jehož inicializace by měla být vynechána.

Poznámky

Tato metoda se obvykle používá k tomu, aby se při inicializaci struktur union-type zabránilo dvojité inicializaci. Podívejte se na následující příklad, který způsobí chybu kompilátoru jazyka 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;
}

K této chybě dochází, protože kompilátor očekává, že všechna pole struktury budou inicializovány dříve, než je struktura použita nebo vrácena volajícímu.

Jedním ze způsobů, jak se této chybě kompilátoru vyhnout, je zajistit, aby byla celá struktura před nastavením jednotlivých polí inicializována nulou, jak je znázorněno v následujícím příkladu.

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

Pokud chcete zabránit počáteční inicializaci nula, můžete voláním SkipInit metody potlačit upozornění kompilátoru.

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

Upozornění

Dbejte na to, aby byla struktura správně inicializována, jinak by pole struktury mohla obsahovat neinicializovaná data ze zásobníku.

Platí pro