C # - Kode Tidak Aman
C # memungkinkan penggunaan variabel penunjuk dalam fungsi blok kode ketika ditandai oleh unsafepengubah. Ituunsafe code atau kode yang tidak dikelola adalah blok kode yang menggunakan file pointer variabel.
Note- Untuk menjalankan program yang disebutkan dalam bab ini di codingground , silakan setel opsi kompilasi di Proyek >> Opsi Kompilasi >> Perintah Kompilasi ke
mcs *.cs -out:main.exe -unsafe"
Pointer
SEBUAH pointeradalah variabel yang nilainya adalah alamat variabel lain, yaitu alamat langsung dari lokasi memori. mirip dengan variabel atau konstanta apapun, Anda harus mendeklarasikan sebuah pointer sebelum Anda dapat menggunakannya untuk menyimpan alamat variabel apapun.
Bentuk umum dari deklarasi pointer adalah -
type *var-name;
Berikut ini adalah deklarasi penunjuk yang valid -
int *ip; /* pointer to an integer */
double *dp; /* pointer to a double */
float *fp; /* pointer to a float */
char *ch /* pointer to a character */
Contoh berikut mengilustrasikan penggunaan pointer di C #, menggunakan pengubah unsafe -
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();
}
}
}
Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -
Data is: 20
Address is: 99215364
Daripada mendeklarasikan seluruh metode sebagai tidak aman, Anda juga dapat mendeklarasikan sebagian kode sebagai tidak aman. Contoh di bagian berikut menunjukkan ini.
Mengambil Nilai Data Menggunakan Pointer
Anda dapat mengambil data yang disimpan di lokasi yang direferensikan oleh variabel pointer, menggunakan ToString()metode. 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();
}
}
}
Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -
Data is: 20
Data is: 20
Address is: 77128984
Meneruskan Pointer sebagai Parameter ke Metode
Anda dapat meneruskan variabel pointer ke metode sebagai parameter. 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();
}
}
}
Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -
Before Swap: var1: 10, var2: 20
After Swap: var1: 20, var2: 10
Mengakses Elemen Array Menggunakan Pointer
Di C #, nama array dan penunjuk ke tipe data yang sama dengan data array, bukan tipe variabel yang sama. Misalnya, int * p dan int [] p, bukan tipe yang sama. Anda dapat menaikkan variabel penunjuk p karena tidak tetap di memori tetapi alamat array tetap di memori, dan Anda tidak bisa menaikkannya.
Oleh karena itu, jika Anda perlu mengakses data array menggunakan variabel pointer, seperti yang biasa kita lakukan di C, atau C ++ (harap periksa: C Pointer ), Anda perlu memperbaiki pointer menggunakanfixed kata kunci.
Contoh berikut menunjukkan ini -
using System;
namespace UnsafeCodeApplication {
class TestPointer {
public unsafe static void Main() {
int[] list = {10, 100, 200};
fixed(int *ptr = list)
/* let us have array address in pointer */
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();
}
}
}
Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai 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] = 200
Menyusun Kode yang Tidak Aman
Untuk mengompilasi kode yang tidak aman, Anda harus menentukan /unsafe saklar baris perintah dengan kompilator baris perintah.
Misalnya, untuk mengompilasi program bernama prog1.cs yang berisi kode tidak aman, dari baris perintah, berikan perintah -
csc /unsafe prog1.cs
Jika Anda menggunakan Visual Studio IDE, Anda harus mengaktifkan penggunaan kode tidak aman di properti proyek.
Untuk melakukan ini -
Buka project properties dengan mengklik dua kali node properti di Solution Explorer.
Klik pada Build tab.
Pilih opsi "Allow unsafe code".