Unsafe.SkipInit<T>(T) メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
特定の参照の明確な割り当て規則をバイパスします。
public:
generic <typename T>
static void SkipInit([Runtime::InteropServices::Out] T % value);
public static void SkipInit<T>(out T value) where T : allows ref struct;
public static void SkipInit<T>(out T value);
static member SkipInit : 'T -> unit
Public Shared Sub SkipInit(Of T) (ByRef value As T)
型パラメーター
- T
参照のタイプ。
パラメーター
- value
- T
初期化をスキップする必要がある参照。
注釈
このメソッドは、通常、共用体型構造体を初期化するときに二重初期化を回避するために使用されます。 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;
}
このエラーは、構造体が使用される前または呼び出し元に返される前に、構造体 のすべての フィールドが初期化されることをコンパイラが想定しているために発生します。
このコンパイラ エラーを回避する 1 つの方法は、次の例に示すように、個々のフィールドが設定される前に構造体全体がゼロ初期化されるようにすることです。
// This sample compiles successfully.
public static MyUnionStruct MyMethod() {
MyUnionStruct value = default; // the struct is now guaranteed assigned
value.SomeIntField = 42;
return value;
}
最初のゼロ初期化を回避する場合は、 SkipInit メソッドを呼び出してコンパイラの警告を抑制できます。
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;
}
Warning
構造体が適切に初期化されていることを確認してください。それ以外の場合は、構造体のフィールドにスタックからの初期化されていないデータが含まれている可能性があります。