C# kod tidak selamat
C# membenarkan penggunaan pembolehubah penunjuk dalam fungsi apabila blok kod ditandakan dengan pengubah suai tidak selamat. Kod tidak selamat atau kod tidak terurus ialah blok kod yang menggunakan pembolehubah penunjuk.
Pembolehubah penunjuk
Penunjuk ialah pembolehubah yang nilainya ialah alamat pembolehubah lain, iaitu alamat langsung lokasi memori. Sama seperti pembolehubah atau pemalar lain, anda mesti mengisytiharkan penunjuk sebelum menggunakannya untuk menyimpan alamat pembolehubah lain.
Bentuk umum pengisytiharan pembolehubah penunjuk ialah:
type *var-name;
Berikut ialah pengisytiharan penunjuk yang sah:
int *ip; /* 指向一个整数 */ double *dp; /* 指向一个双精度数 */ float *fp; /* 指向一个浮点数 */ char *ch /* 指向一个字符 */
Contoh berikut menggambarkan penggunaan tidak selamat<🎜 dalam C# > Penggunaan penunjuk apabila pengubah suai:
using System; namespace UnsafeCodeApplication { class Program { static unsafe void Main(string[] args) { int var = 20; int* p = &var; Console.WriteLine("Data is: {0} ", var); Console.WriteLine("Address is: {0}", (int)p); Console.ReadKey(); } } }Apabila kod di atas disusun dan dilaksanakan, ia akan menghasilkan keputusan berikut:
Data is: 20 Address is: 99215364Anda juga boleh mengelak daripada mengisytiharkan keseluruhan kaedah sebagai kod tidak selamat, Hanya sebahagian daripada kaedah yang perlu diisytiharkan sebagai kod tidak selamat. Contoh berikut menggambarkan perkara ini. Mendapatkan semula nilai data menggunakan penunjukAnda boleh menggunakan kaedah
ToString() untuk mendapatkan semula data yang disimpan di lokasi yang dirujuk oleh pembolehubah penunjuk. Contoh berikut menunjukkan ini:
using System; namespace UnsafeCodeApplication { class Program { public static void Main() { unsafe { int var = 20; int* p = &var; Console.WriteLine("Data is: {0} " , var); Console.WriteLine("Data is: {0} " , p->ToString()); Console.WriteLine("Address is: {0} " , (int)p); } Console.ReadKey(); } } }Apabila kod di atas disusun dan dilaksanakan, ia menghasilkan keputusan berikut:
Data is: 20 Data is: 20 Address is: 77128984Melalukan penunjuk sebagai parameter kaedah Anda boleh lulus pembolehubah penunjuk kepada kaedah sebagai parameter kaedah. Contoh berikut menggambarkan ini:
using System; namespace UnsafeCodeApplication { class TestPointer { public unsafe void swap(int* p, int *q) { int temp = *p; *p = *q; *q = temp; } public unsafe static void Main() { TestPointer p = new TestPointer(); int var1 = 10; int var2 = 20; int* x = &var1; int* y = &var2; Console.WriteLine("Before Swap: var1:{0}, var2: {1}", var1, var2); p.swap(x, y); Console.WriteLine("After Swap: var1:{0}, var2: {1}", var1, var2); Console.ReadKey(); } } }Apabila kod di atas disusun dan dilaksanakan, ia menghasilkan keputusan berikut:
Before Swap: var1: 10, var2: 20 After Swap: var1: 20, var2: 10Menggunakan penunjuk untuk mengakses elemen tatasusunanDalam Dalam C# , nama tatasusunan dan penunjuk kepada jenis data yang sama seperti data tatasusunan ialah jenis pembolehubah yang berbeza. Contohnya, int *p dan int[] p ialah jenis yang berbeza. Anda boleh menambah pembolehubah penunjuk p kerana ia tidak ditetapkan dalam ingatan, tetapi alamat tatasusunan ditetapkan dalam ingatan supaya anda tidak boleh menambah tatasusunan p. Jadi, jika anda perlu mengakses data tatasusunan menggunakan pembolehubah penunjuk, anda boleh membetulkan penuding menggunakan kata kunci
tetap seperti yang biasa kita lakukan dalam C atau C++.
Contoh berikut menunjukkan ini:using System; namespace UnsafeCodeApplication { class TestPointer { public unsafe static void Main() { int[] list = {10, 100, 200}; fixed(int *ptr = list) /* 显示指针中数组地址 */ for ( int i = 0; i < 3; i++) { Console.WriteLine("Address of list[{0}]={1}",i,(int)(ptr + i)); Console.WriteLine("Value of list[{0}]={1}", i, *(ptr + i)); } Console.ReadKey(); } } }Apabila kod di atas disusun dan dilaksanakan, ia menghasilkan keputusan berikut:
Address of list[0] = 31627168 Value of list[0] = 10 Address of list[1] = 31627172 Value of list[1] = 100 Address of list[2] = 31627176 Value of list[2] = 200Menyusun kod tidak selamat Untuk menyusun kod tidak selamat, anda mesti bertukar kepada pengkompil baris arahan dan nyatakan baris arahan
/unsafe.
Sebagai contoh, untuk menyusun atur cara bernama prog1.cs yang mengandungi kod tidak selamat, masukkan arahan pada baris arahan:csc /unsafe prog1.csJika anda menggunakan Visual Studio IDE, anda akan Dayakan tidak selamat kod dalam sifat projek. Langkah-langkahnya adalah seperti berikut:
- Buka
sifat projek<🎜 dengan mengklik dua kali nod sifat dalam Solution Explorer >.
Klik pada tab - Bina
.
Pilih pilihan " - Benarkan kod tidak selamat
".