Unsafe.SkipInit<T>(T) Method
Definition
Important
Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.
Bypasses definite assignment rules for a given reference.
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)
Type Parameters
- T
The type of the reference.
Parameters
- value
- T
The reference whose initialization should be skipped.
Remarks
This method is typically used to avoid double-initialization when initializing union-type structs. Consider the following example, which produces a C# compiler error.
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 error occurs because the compiler expects all fields of the struct to be initialized before the struct is used or returned to the caller.
One way to avoid this compiler error is to ensure the entire struct is zero-initialized before individual fields are set, as shown in the following example.
// This sample compiles successfully.
public static MyUnionStruct MyMethod() {
MyUnionStruct value = default; // the struct is now guaranteed assigned
value.SomeIntField = 42;
return value;
}
If you want to avoid the initial zero-initialization, you can call the SkipInit
method can be used to suppress the compiler warning.
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;
}
Warning
Take care to ensure that the struct has been initialized appropriately, otherwise the struct's fields could contain uninitialized data from the stack.