Unsafe.SkipInit<T>(T) Método
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Omite las reglas de asignación definitivas para una referencia determinada.
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)
Parámetros de tipo
- T
Tipo de la referencia.
Parámetros
- value
- T
Referencia cuya inicialización se debe omitir.
Comentarios
Este método se usa normalmente para evitar la inicialización doble al inicializar estructuras de tipo de unión. Considere el ejemplo siguiente, que genera un error del compilador de 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;
}
Este error se produce porque el compilador espera que se inicialicen todos los campos de la estructura antes de que se use o se devuelva al autor de la llamada.
Una manera de evitar este error del compilador es asegurarse de que toda la estructura se inicializa sin inicializar antes de que se establezcan campos individuales, como se muestra en el ejemplo siguiente.
// This sample compiles successfully.
public static MyUnionStruct MyMethod() {
MyUnionStruct value = default; // the struct is now guaranteed assigned
value.SomeIntField = 42;
return value;
}
Si desea evitar la inicialización cero inicial, puede llamar al SkipInit
método para suprimir la advertencia del compilador.
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;
}
Advertencia
Tenga cuidado de asegurarse de que la estructura se ha inicializado correctamente; de lo contrario, los campos de la estructura podrían contener datos no inicializados de la pila.