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) 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;
}
此錯誤發生是因為編譯器期望在使用或回傳給呼叫者之前, 所有欄位都 已初始化。
避免此編譯錯誤的一種方法是確保整個結構體在設定個別欄位前已為零初始化,如下範例所示。
// 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;
}
警告
請確保結構體已正確初始化,否則結構體欄位可能包含堆疊中未初始化的資料。