次の方法で共有


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

定義

指定された参照の明確な割り当てルールをバイパスします。

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)

型パラメーター

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;
}

警告

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

適用対象