Melalui menggunakan IntelliSense dan melihat kode orang lain, saya telah menemukan IntPtr
tipe ini ; setiap kali itu perlu digunakan, saya hanya menempatkan null
atau IntPtr.Zero
dan menemukan sebagian besar fungsi untuk bekerja. Apa sebenarnya itu dan kapan / mengapa digunakan?
171
IntPtr
masuk akal, karena itu adalah bilangan bulat (seperti dalam bilangan bulat matematika) dan sebuah pointer (seperti dalam pointer). BagianInt
ini tidak ada hubungannya dengan tipe int - ini adalah konsep, bukan tipe spesifik. Meskipun untuk bersikap adil, satu-satunya spek CLI mengatakan tentang itu adalah bahwa itu memang "bilangan bulat, asli". Oh well :)Ini adalah tipe nilai yang cukup besar untuk menyimpan alamat memori seperti yang digunakan dalam kode asli atau tidak aman, tetapi tidak secara langsung dapat digunakan sebagai alamat memori dalam kode yang dikelola dengan aman.
Anda dapat menggunakan
IntPtr.Size
untuk mengetahui apakah Anda menjalankan proses 32-bit atau 64-bit, karena masing-masing akan menjadi 4 atau 8 byte.sumber
IntPtr
juga digunakan untuk mewakili pegangan yang 32-bit terlepas dari arsitektur (meskipunSize
masih mengatakan 8 dalam kasus itu). Spesifikasi CLI hanya mencatat bahwa itu adalah bilangan bulat yang "asli ukuran", tetapi itu tidak banyak bicara, sungguh.Ini sebuah contoh:
Saya sedang menulis program C # yang berinteraksi dengan kamera kecepatan tinggi. Kamera memiliki driver sendiri yang memperoleh gambar dan memuatnya ke dalam memori komputer untuk saya secara otomatis.
Jadi ketika saya siap untuk membawa gambar terbaru ke dalam program saya untuk bekerja dengan, driver kamera memberi saya IntPtr ke tempat gambar SUDAH disimpan dalam memori fisik, jadi saya tidak perlu membuang waktu / sumber daya membuat yang lain blok memori untuk menyimpan gambar yang sudah ada dalam memori. IntPtr hanya menunjukkan kepada saya di mana gambar sudah.
sumber
Penafsiran langsung
Sebuah IntPtr adalah bilangan bulat yang merupakan ukuran yang sama sebagai pointer .
Anda dapat menggunakan IntPtr untuk menyimpan nilai pointer dalam tipe non-pointer. Fitur ini penting dalam. NET karena menggunakan pointer sangat rawan kesalahan dan karenanya ilegal dalam sebagian besar konteks. Dengan membiarkan nilai pointer disimpan dalam tipe data "aman", masukkan antara yang tidak aman segmen kode yang dapat diimplementasikan dalam kode tingkat tinggi yang lebih aman - atau bahkan dalam bahasa .NET yang tidak secara langsung mendukung pointer.
Ukuran IntPtr khusus untuk platform, tetapi detail ini jarang perlu dipertimbangkan, karena sistem akan secara otomatis menggunakan ukuran yang benar.
Nama "IntPtr" membingungkan - sesuatu seperti
Handle
mungkin lebih tepat. Dugaan awal saya adalah "IntPtr" adalah pointer ke integer. The MSDN dokumentasi IntPtr masuk ke detail agak samar tanpa pernah memberikan banyak wawasan tentang arti nama.Perspektif alternatif
An
IntPtr
adalah pointer dengan dua batasan:Dengan kata lain, sebuah
IntPtr
sepertivoid*
- tetapi dengan fitur tambahan yang dapat (tetapi tidak seharusnya) digunakan untuk aritmatika pointer dasar.Untuk melakukan dereferensi
IntPtr
, Anda dapat melemparkannya ke pointer yang benar (operasi yang hanya dapat dilakukan dalam konteks "tidak aman") atau Anda dapat meneruskannya ke rutinitas pembantu seperti yang disediakan olehInteropServices.Marshal
kelas. MenggunakanMarshal
kelas memberikan ilusi keselamatan karena tidak mengharuskan Anda berada dalam konteks eksplisit "tidak aman". Namun, itu tidak menghapus risiko menabrak yang melekat dalam penggunaan pointer.sumber
Apa itu Pointer?
Dalam semua bahasa, penunjuk adalah jenis variabel yang menyimpan alamat memori, dan Anda bisa meminta mereka untuk memberi tahu Anda alamat yang mereka tunjuk atau nilai pada alamat yang mereka tunjuk.
Pointer dapat dianggap sebagai semacam tanda buku. Kecuali, alih-alih digunakan untuk melompat dengan cepat ke halaman dalam buku, pointer digunakan untuk melacak atau memetakan blok memori.
Bayangkan memori program Anda persis seperti satu array besar 65535 byte.
Pointer menunjuk dengan patuh
Pointer masing-masing mengingat satu alamat memori, dan karenanya masing-masing menunjuk ke satu alamat dalam memori.
Sebagai sebuah grup, pointer mengingat dan mengingat alamat memori, mematuhi setiap perintah dan mual Anda.
Anda adalah raja mereka.
Pointer dalam C #
Juga spesifik untuk C #, pointer bertipe int dan karenanya ditandatangani.
Anda tidak dapat menggunakan alamat bernomor negatif, Anda juga tidak dapat mengakses alamat di atas 65534. Upaya apa pun untuk melakukannya akan melempar System.AccessViolationException.
Pointer bernama MyPointer dinyatakan seperti ini:
Pointer di C # adalah sebuah int, tetapi alamat memori di C # mulai dari 0 dan diperluas hingga 65534.
Hal-hal yang runcing harus ditangani dengan perawatan khusus
Kata tidak aman adalah dimaksudkan untuk menakut-nakuti Anda, dan untuk alasan yang sangat baik: Pointer adalah hal-hal runcing, dan hal runcing misalnya pedang, kapak, pointer, dll harus ditangani dengan perawatan khusus ekstra.
Pointer memberi programmer kontrol ketat terhadap suatu sistem. Karena itu kesalahan yang dilakukan cenderung memiliki konsekuensi yang lebih serius.
Untuk menggunakan pointer, kode tidak aman harus diaktifkan di properti program Anda, dan pointer harus digunakan secara eksklusif dalam metode atau blok yang ditandai sebagai tidak aman.
Contoh blok yang tidak aman
Cara menggunakan Pointer
Ketika variabel atau objek dideklarasikan atau dipakai, mereka disimpan dalam memori.
int *MyPointer;
MyPointer = &MyVariable;
Setelah alamat ditetapkan ke pointer, hal berikut ini berlaku:
MyPointer = &MyVariable; // Set MyPointer to point at MyVariable
"MyPointer is pointing at " + *MyPointer;
Karena pointer adalah variabel yang menyimpan alamat memori, alamat memori ini dapat disimpan dalam variabel pointer.
Contoh pointer digunakan dengan hati-hati dan bertanggung jawab
Perhatikan jenis pointer adalah int. Ini karena C # mengartikan alamat memori sebagai angka integer (int).
Mengapa itu int bukan uint?
Tidak ada alasan bagus.
Mengapa menggunakan pointer?
Pointer sangat menyenangkan. Dengan begitu banyak komputer yang dikendalikan oleh memori, pointer memberdayakan seorang programmer dengan lebih banyak kontrol memori program mereka.
Pemantauan memori.
Gunakan pointer untuk membaca blok memori dan memantau bagaimana nilai-nilai yang ditunjukkan berubah seiring waktu.
Ubah nilai-nilai ini secara bertanggung jawab dan catat bagaimana perubahan Anda memengaruhi komputer Anda.
sumber
65534
tampaknya sangat salah sebagai rentang pointer. Anda harus memberikan referensi.System.IntPtr
. Saya ingin melihat jawaban diperbarui di akhir menjelaskan apa jugaSystem.IntPtr
dan bagaimana hubungannya dengan pointer tidak aman di C # tolong.MSDN memberi tahu kami:
http://msdn.microsoft.com/en-us/library/system.intptr(VS.71).aspx
sumber
Yah ini adalah halaman MSDN yang berhubungan dengan
IntPtr
.Baris pertama berbunyi:
Sehubungan dengan pointer atau handle, halaman selanjutnya menyatakan:
Pointer adalah referensi ke area memori yang menyimpan beberapa data yang Anda minati.
Pegangan dapat menjadi pengidentifikasi untuk objek dan diteruskan antara metode / kelas ketika kedua belah pihak perlu mengakses objek itu.
sumber
Sebuah
IntPtr
adalah jenis nilai yang terutama digunakan untuk alamat memori memegang atau menangani. Sebuah pointer adalah alamat memori. Pointer dapat diketik (mis.int*
) Atau tidak diketik (misvoid*
.). Sebuah Windows pegangan adalah nilai yang biasanya ukuran yang sama (atau lebih kecil) dari alamat memori dan merupakan sistem sumber daya (seperti file atau jendela).sumber