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;
}
發生此錯誤的原因是編譯程式預期結構的所有欄位在使用結構或傳回給呼叫端之前,先初始化結構 的所有 欄位。
避免這個編譯程序錯誤的其中一個方法是確保整個結構在設定個別欄位之前,先以零初始化,如下列範例所示。
// 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;
}
警告
請小心確保結構已適當地初始化,否則結構欄位可能會包含堆疊中未初始化的數據。