Unsafe.SkipInit<T>(T) Metodo
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Ignora le regole di assegnazione definite per un determinato riferimento.
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)
Parametri di tipo
- T
Tipo del riferimento.
Parametri
- value
- T
Riferimento di cui ignorare l'inizializzazione.
Commenti
Questo metodo viene in genere usato per evitare l'inizializzazione doppia durante l'inizializzazione di struct di tipo unione. Si consideri l'esempio seguente, che genera un errore del compilatore 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;
}
Questo errore si verifica perché il compilatore prevede che tutti i campi dello struct vengano inizializzati prima che venga usato o restituito al chiamante.
Un modo per evitare questo errore del compilatore consiste nel garantire che l'intero struct sia inizializzato zero prima che vengano impostati i singoli campi, come illustrato nell'esempio seguente.
// This sample compiles successfully.
public static MyUnionStruct MyMethod() {
MyUnionStruct value = default; // the struct is now guaranteed assigned
value.SomeIntField = 42;
return value;
}
Se si desidera evitare l'inizializzazione iniziale zero, è possibile chiamare il SkipInit
metodo per eliminare l'avviso del compilatore.
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;
}
Avviso
Assicurarsi che lo struct sia stato inizializzato in modo appropriato. In caso contrario, i campi dello struct potrebbero contenere dati non inizializzati dallo stack.