Unsafe.As 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.
Overload
As<T>(Object) |
Melemparkan objek yang diberikan ke jenis yang ditentukan. |
As<TFrom,TTo>(TFrom) |
Menginterpretasi ulang penunjuk terkelola yang diberikan sebagai penunjuk terkelola baru ke nilai jenis |
As<T>(Object)
- Sumber:
- Unsafe.cs
- Sumber:
- Unsafe.cs
- Sumber:
- Unsafe.cs
Melemparkan objek yang diberikan ke jenis yang ditentukan.
public:
generic <typename T>
where T : class static T As(System::Object ^ o);
public static T? As<T> (object? o) where T : class;
public static T As<T> (object o) where T : class;
static member As : obj -> 'T (requires 'T : null)
Public Shared Function As(Of T As Class) (o As Object) As T
Jenis parameter
- T
Jenis tempat objek akan dilemparkan.
Parameter
- o
- Object
Objek yang akan dilemparkan.
Mengembalikan
Objek asli, dilemparkan ke jenis yang diberikan.
Keterangan
API ini digunakan untuk melemparkan objek ke jenis tertentu, menekan pemeriksaan keamanan jenis normal runtime. Adalah tanggung jawab pemanggil untuk memastikan bahwa pemeran adalah legal. Tidak InvalidCastException
akan dilemparkan.
Perilaku Unsafe.As<T>(o)
hanya didefinisikan dengan baik jika operasi (T)o
pengecoran "aman" yang khas akan berhasil. Penggunaan API ini untuk menghindari transmisi yang jika tidak gagal tidak didukung dan dapat mengakibatkan ketidakstabilan runtime.
Untuk membantu memberlakukan penggunaan yang benar, pengembang mungkin mempertimbangkan untuk menggunakan cast standar atau pernyataan debug-only dalam kode mereka, seperti yang ditunjukkan dalam contoh berikut.
void ReinterpretCastAndUse_Sample1(object o)
{
// Assume that we know through some other means that 'o' is a string,
// and we want our library's debug builds to verify this.
// One way to do this is through a standard-style cast.
// A standard-style cast will throw InvalidCastException at runtime if the cast fails.
// n.b. Casts of null objects to reference types will succeed.
#if DEBUG
string s = (string)o;
#else
string s = Unsafe.As<string>(o);
#endif
DoSomethingWith(s);
}
void ReinterpretCastAndUse_Sample2(object o)
{
// Another way to check this is through a debug-only assert.
// Failed assertions will trigger attached debuggers or terminate the application immediately.
// Calls to Debug.Assert are removed from release builds.
Debug.Assert(o is null or string, "Unsafe.As call below is illegal!");
string s = Unsafe.As<string>(o);
DoSomethingWith(s);
}
Berlaku untuk
As<TFrom,TTo>(TFrom)
- Sumber:
- Unsafe.cs
- Sumber:
- Unsafe.cs
- Sumber:
- Unsafe.cs
Menginterpretasi ulang penunjuk terkelola yang diberikan sebagai penunjuk terkelola baru ke nilai jenis TTo
.
public:
generic <typename TFrom, typename TTo>
static TTo % As(TFrom % source);
public static ref TTo As<TFrom,TTo> (ref TFrom source);
static member As : 'From -> 'o
Public Shared Function As(Of TFrom, TTo) (ByRef source As TFrom) As TTo
Jenis parameter
- TFrom
Jenis penunjuk terkelola untuk diinterpretasikan ulang.
- TTo
Jenis pointer terkelola yang diinginkan.
Parameter
- source
- TFrom
Penunjuk terkelola untuk diinterpretasikan ulang.
Mengembalikan
Pointer terkelola ke nilai jenis TTo
.
Keterangan
API ini secara konseptual mirip dengan C++.reinterpret_cast<>
Adalah tanggung jawab pemanggil untuk memastikan bahwa pemeran adalah legal. Tidak ada pemeriksaan runtime yang akan dilakukan.
Hanya penunjuk terkelola yang diinterpretasikan ulang. Nilai yang direferensikan itu sendiri akan tetap tidak berubah. Pertimbangkan contoh berikut.
int[] intArray = new int[] { 0x1234_5678 }; // a 1-element array
ref int refToInt32 = ref intArray[0]; // managed pointer to first Int32 in array
ref short refToInt16 = ref Unsafe.As<int, short>(ref refToInt32); // reinterpret as managed pointer to Int16
Console.WriteLine($"0x{refToInt16:x4}");
Output program ini tergantung pada endianness komputer saat ini. Pada arsitektur big-endian, kode ini menghasilkan 0x1234
. Pada arsitektur little-endian, kode ini menghasilkan 0x5678
.
Saat mentransmisikan penunjuk terkelola dari jenis yang lebih sempit ke jenis yang lebih luas, pemanggil harus memastikan bahwa dereferensi penunjuk tidak akan menimbulkan akses di luar batas. Pemanggil juga bertanggung jawab untuk memastikan bahwa penunjuk yang dihasilkan diselaraskan dengan benar untuk jenis yang direferensikan. Untuk informasi selengkapnya tentang asumsi perataan, lihat ECMA-335, Detik I.12.6.2 ("Perataan").