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

发生此错误的原因是编译器希望在使用结构或将结构返回到调用方之前初始化结构 的所有 字段。

避免此编译器错误的一种方法是确保在设置单个字段之前将整个结构零初始化,如以下示例所示。

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

警告

注意确保已正确初始化结构,否则结构的字段可能包含堆栈中的未初始化数据。

适用于