Unsafe.SkipInit<T>(T) Metode
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Melewati aturan penetapan yang pasti untuk referensi tertentu.
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)
Jenis parameter
- T
Jenis referensi.
Parameter
- value
- T
Referensi yang inisialisasinya harus dilewati.
Keterangan
Metode ini biasanya digunakan untuk menghindari inisialisasi ganda saat menginisialisasi struct jenis union. Pertimbangkan contoh berikut, yang menghasilkan kesalahan pengkompilasi 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;
}
Kesalahan ini terjadi karena pengkompilasi mengharapkan semua bidang struktur diinisialisasi sebelum struct digunakan atau dikembalikan ke pemanggil.
Salah satu cara untuk menghindari kesalahan pengkompilasi ini adalah dengan memastikan seluruh struktur diinisialisasi nol sebelum bidang individual diatur, seperti yang ditunjukkan dalam contoh berikut.
// This sample compiles successfully.
public static MyUnionStruct MyMethod() {
MyUnionStruct value = default; // the struct is now guaranteed assigned
value.SomeIntField = 42;
return value;
}
Jika Anda ingin menghindari inisialisasi nol awal, Anda dapat memanggil SkipInit
metode dapat digunakan untuk menekan peringatan pengompilasi.
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;
}
Peringatan
Berhati-hatilah untuk memastikan bahwa struktur telah diinisialisasi dengan tepat, jika tidak, bidang struct dapat berisi data yang tidak diinisialisasi dari tumpukan.