Unsafe.SkipInit<T>(T) Метод

Определение

Проходит определенные правила назначения для заданной ссылки.

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

Предупреждение

Убедитесь, что структуру инициализированы соответствующим образом, в противном случае поля структуры могут содержать неинициализированные данные из стека.

Применяется к