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;
}
Предупреждение
Убедитесь, что структуру инициализированы соответствующим образом, в противном случае поля структуры могут содержать неинициализированные данные из стека.