Tutorial C#login
Tutorial C#
pengarang:php.cn  masa kemas kini:2022-04-11 14:06:23

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: 99215364

Anda 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 penunjuk

Anda 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: 77128984

Melalukan 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: 10

Menggunakan penunjuk untuk mengakses elemen tatasusunan

Dalam 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] = 200

Menyusun 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.cs

Jika 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

    ".