Unsafe.SkipInit<T>(T) Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
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.