Unsafe.SkipInit<T>(T) Méthode

Définition

Contourne les règles d’affectation définies pour une référence donnée.

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)

Paramètres de type

T

Type de la référence.

Paramètres

value
T

Référence dont l’initialisation doit être ignorée.

Remarques

Cette méthode est généralement utilisée pour éviter la double initialisation lors de l’initialisation de structs de type union. Prenons l’exemple suivant, qui génère une erreur du compilateur 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;
}

Cette erreur se produit parce que le compilateur s’attend à ce que tous les champs du struct soient initialisés avant que le struct ne soit utilisé ou retourné à l’appelant.

Une façon d’éviter cette erreur du compilateur consiste à s’assurer que l’ensemble du struct est zéro initialisé avant que des champs individuels soient définis, comme illustré dans l’exemple suivant.

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

Si vous souhaitez éviter l’initialisation zéro, vous pouvez appeler la SkipInit méthode peut être utilisée pour supprimer l’avertissement du compilateur.

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

Avertissement

Veillez à ce que le struct ait été initialisé de manière appropriée, sinon les champs du struct pourraient contenir des données non initialisées de la pile.

S’applique à