Unsafe.SkipInit<T>(T) Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Обход определенных правил присваивания для данной ссылки.
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;
}
Предупреждение
Обеспечьте правильную инициализацию структуры, в противном случае поля структуры могут содержать неинициализированные данные из стека.