Share via


Unsafe.As Metode

Definisi

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 TTo.

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

T

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

TTo

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").

Berlaku untuk