Unsafe.SkipInit<T>(T) メソッド

定義

特定の参照の明確な割り当て規則をバイパスします。

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

構造体が適切に初期化されていることを確認してください。それ以外の場合は、構造体のフィールドにスタックからの初期化されていないデータが含まれている可能性があります。

適用対象