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);
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;
}
경고
구조체가 적절하게 초기화되었는지 확인합니다. 그렇지 않으면 구조체의 필드에 스택의 초기화되지 않은 데이터가 포함될 수 있습니다.
적용 대상
GitHub에서 Microsoft와 공동 작업
이 콘텐츠의 원본은 GitHub에서 찾을 수 있으며, 여기서 문제와 끌어오기 요청을 만들고 검토할 수도 있습니다. 자세한 내용은 참여자 가이드를 참조하세요.
.NET