Unsafe.SkipInit<T>(T) Méthode
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
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.