Cara menggunakan pointer terkelola di C #

Pointer adalah variabel yang menunjuk ke alamat variabel lain. Dengan kata lain, sebuah pointer menyimpan alamat memori dari variabel lain atau lokasi memori. Sampai saat ini, satu-satunya cara untuk bekerja dengan pointer di C # adalah dengan menggunakan kode yang tidak aman. Anda dapat memanfaatkan unsafe kata kunci untuk menentukan konteks yang tidak aman dan kemudian membuat pointer yang tidak dikelola atau menjalankan fungsi asli menggunakan pointer yang tidak dikelola.

Perlu dicatat di sini bahwa kode yang tidak aman menyiratkan kode yang dijalankan di luar konteks CLR. Ini adalah kode yang tidak dikelola. Namun, karena Anda menonaktifkan keamanan yang disediakan oleh CLR secara default, disarankan agar Anda menggunakan kode yang tidak aman hanya jika Anda mengetahui cara kerja manajemen memori di .Net.

Referensi objek di C # adalah penunjuk tipe aman yang menunjuk ke awal objek. Ada jenis penunjuk lain di CLR yang dikenal sebagai penunjuk terkelola. Artikel ini membahas apa itu penunjuk terkelola, mengapa berguna, dan bagaimana kita dapat bekerja dengannya di C #.

Petunjuk yang dikelola di C # menjelaskan

Penunjuk yang dikelola berbeda dari penunjuk tipe-aman karena dapat menunjuk ke lokasi lain dari suatu objek, yaitu, bukan hanya awal objek. Seperti referensi objek, penunjuk terkelola bisa menunjuk ke objek yang disimpan di heap terkelola. Perbedaannya adalah, sementara referensi objek menunjuk ke awal objek, penunjuk yang dikelola dapat menunjuk ke parameter metode, bidang, elemen array, atau bagian lain dari objek.

Intinya, penunjuk yang dikelola dapat menunjukkan hal berikut:

  • variabel lokal
  • sebuah elemen dari sebuah array
  • parameter metode
  • bidang tipe gabungan

Pointer yang dikelola tidak mendukung aritmatika pointer secara langsung. Anda tidak dapat "menambahkan" atau "mengurangi" nilai alamat yang mereka tunjuk. Anda tidak dapat mengemas nilai penunjuk yang dikelola. Rupanya, karena keterbatasan inilah pointer yang dikelola tidak secara eksplisit diekspos dalam bahasa C #. Namun, pointer yang dikelola telah tersirat dalam C # untuk waktu yang lama sebagai parameter referensi. Saat Anda mengirimkan parameter ke metode dengan referensi, Anda menggunakan penunjuk terkelola di belakang layar.

10 aturan untuk menggunakan pointer terkelola di C #

Perhatikan poin-poin berikut pada pointer terkelola.

  1. Pointer yang dikelola tidak boleh kosong.
  2. Penunjuk terkelola tidak dapat menunjuk ke penunjuk terkelola lainnya.
  3. Pointer yang dikelola tidak boleh ada di heap.
  4. Anda tidak dapat menukar penunjuk yang dikelola dengan referensi objek.
  5. Anda tidak dapat menyimpan pointer terkelola dalam variabel statis atau sebagai elemen larik atau bidang.
  6. Anda tidak dapat menggunakan pointer terkelola sebagai tipe elemen dari sebuah array.
  7. Penunjuk yang dikelola bisa menunjuk ke referensi objek atau tipe nilai.
  8. Jika Anda meneruskan parameter metode sebagai referensi, argumen sebenarnya adalah pointer yang dikelola.
  9. Pointer terkelola juga disebut sebagai tipe byref.
  10. Pointer yang dikelola dapat menunjuk ke variabel lokal dari suatu metode atau parameter suatu metode.

Berikan argumen dengan referensi di C #

Oke, kita sudah muak dengan konsepnya. Sekarang mari kita menulis beberapa kode untuk memahami petunjuk yang dikelola. Anda dapat menggunakan parameter ref, ref local, atau ref return untuk merepresentasikan pointer yang dikelola. Mari kita telusuri masing-masing satu per satu.

Pertimbangkan struct berikut yang berisi hanya satu anggota, variabel integer.

public struct MyStruct

{

   public int MyField;

}

Metode berikut memperbarui nilai anggota data MyField dari sebuah instance MyStruct.

Private static void Update (lihat data MyStruct)

{

   data.MyField = 5;

}

Cuplikan kode berikut mengilustrasikan bagaimana Anda bisa meneruskan argumen dengan referensi alih-alih nilai.

public int Main ()

{

  MyStruct obj = MyStruct baru ();

  obj.MyField = 1;

  Perbarui (ref obj);

  Console.WriteLine (obj.MyField);

  Console.Read ();

}

Anda dapat memanfaatkan struct sebagai pengganti kelas untuk menghindari alokasi heap dan overhead penyalinan data. Ini adalah trik pengoptimalan yang bagus yang dapat digunakan untuk struct yang memiliki sedikit anggota data.

Saat Anda menjalankan program di atas, "5" ditampilkan di jendela konsol.

Gunakan ref lokal untuk menyimpan penunjuk terkelola di C #

Anda juga bisa menggunakan ref lokal untuk menyimpan penunjuk terkelola. Potongan kode berikut menggambarkan bagaimana hal ini dapat dicapai. Perhatikan penggunaan kata kunci ref di kedua sisi tugas.

public static void UpdateDataUsingRefLocal (data MyStruct)

  {

     ref int refLocal = ref data.MyField;

     refLocal = 10;

  }

Anda dapat memanfaatkan pengembalian ref untuk mengembalikan variabel dari metode yang mewakili penunjuk terkelola. Perhatikan bahwa ini tidak bisa menjadi variabel lokal, misalnya, Anda tidak bisa mengembalikan variabel lokal yang mewakili penunjuk yang dikelola. Upaya untuk mengembalikan variabel lokal akan menghasilkan kesalahan kompilasi.

Potongan kode berikut menggambarkan bagaimana pengembalian ref dapat digunakan.

public static ref int GetMarksByRef (tanda int [], int subjectIndex)

{

  kembali tanda ref [subjectIndex];

}

Sedangkan referensi objek menunjuk ke awal objek, pointer yang dikelola bisa menunjuk ke dalam objek, ke bidang tipe, atau ke elemen array. Sangat menarik untuk mengetahui bagaimana pointer terkelola bekerja di belakang layar. Saya akan membahas cara kerja pointer terkelola secara lebih rinci dalam posting mendatang di sini.