다음을 통해 공유


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

이 오류는 컴파일러가 구조체를 사용하거나 호출자에게 반환하기 전에 구조체의 모든 필드를 초기화해야 하기 때문에 발생합니다.

이 컴파일러 오류를 방지하는 한 가지 방법은 다음 예제와 같이 개별 필드를 설정하기 전에 전체 구조체가 0으로 초기화되도록 하는 것입니다.

// This sample compiles successfully.
public static MyUnionStruct MyMethod() {
    MyUnionStruct value = default; // the struct is now guaranteed assigned
    value.SomeIntField = 42;
    return value;
}

초기 0 초기화를 방지하려면 메서드를 호출 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;
}

경고

구조체가 적절하게 초기화되었는지 확인합니다. 그렇지 않으면 구조체의 필드에 스택의 초기화되지 않은 데이터가 포함될 수 있습니다.

적용 대상