IntelliSense'i kullanarak ve başkalarının kodlarına bakarak bu IntPtr
tipte karşılaştım; her kullanılması gerektiğinde, çoğu işlevi işe koydum null
veya IntPtr.Zero
buldum. Tam olarak nedir ve ne zaman / neden kullanılır?
IntelliSense'i kullanarak ve başkalarının kodlarına bakarak bu IntPtr
tipte karşılaştım; her kullanılması gerektiğinde, çoğu işlevi işe koydum null
veya IntPtr.Zero
buldum. Tam olarak nedir ve ne zaman / neden kullanılır?
Yanıtlar:
"Yerel (platforma özgü) boyutta bir tam sayı." Dahili olarak temsil edilir, void*
ancak bir tamsayı olarak gösterilir. Yönetilmeyen bir işaretçiyi saklamanız gerektiğinde ve unsafe
kod kullanmak istemediğinizde kullanabilirsiniz . IntPtr.Zero
etkin NULL
(boş gösterici).
IntPtr
mükemmel bir anlam ifade eder, çünkü bir tamsayıdır (matematiksel tamsayıda olduğu gibi) ve bir işaretçi (işaretçide olduğu gibi). Bölümün Int
int türüyle ilgisi yoktur - bu bir kavramdır, belirli bir tür değildir. Adil olmakla birlikte, CLI spesifikasyonunun bu konuda söylediği tek şey, bunun bir "Tamsayı, yerel boyut" olduğudur. Oh well :)
Bellek adresini yerel veya güvenli olmayan kodda kullanıldığı şekilde depolayacak kadar büyük ancak güvenli yönetilen kodda doğrudan bellek adresi olarak kullanılamayan bir değer türüdür.
IntPtr.Size
Sırasıyla 4 veya 8 bayt olacağından, 32 bit veya 64 bit işlemde çalışıp çalışmadığınızı öğrenmek için kullanabilirsiniz .
IntPtr
mimariden bağımsız olarak 32 bitlik tutamaçları temsil etmek için de kullanılıyordu (yine Size
de bu durumda 8 diyor). CLI spesifikasyonu sadece bunun "yerel boyutta" bir tamsayı olduğuna dikkat çeker, ancak bu pek bir şey söylemez.
İşte bir örnek:
Yüksek hızlı bir kamerayla arayüz oluşturan bir C # programı yazıyorum. Kameranın görüntüleri otomatik olarak alıp otomatik olarak bilgisayarın belleğine yükleyen kendi sürücüsü var.
Bu yüzden çalışmak için programıma en son görüntüyü getirmeye hazır olduğumda, kamera sürücüsü bana görüntünün ZATEN fiziksel bellekte saklandığı yere bir IntPtr sağlar, bu yüzden başka bir şey yaratarak zaman / kaynak harcamak zorunda kalmam bellekte bulunan bir görüntüyü saklamak için bellek bloğu. IntPtr bana görüntünün zaten nerede olduğunu gösteriyor.
Bir ıntptr bir bir tam sayıdır , bir aynı boyutta olan işaretçi .
İşaretçi türünü işaretçi olmayan bir türde saklamak için IntPtr kullanabilirsiniz. Bu özellik .NET'te önemlidir çünkü işaretçilerin kullanımı hataya açıktır ve bu nedenle çoğu bağlamda yasa dışıdır. İşaretçi değerinin "güvenli" bir veri türünde depolanmasına izin vererek, güvenli olmayan kod bölümleri arasında sıhhi tesisat daha güvenli üst düzey kodlarda, hatta doğrudan işaretçileri desteklemeyen bir .NET dilinde uygulanabilir.
IntPtr'in boyutu platforma özgüdür, ancak sistem otomatik olarak doğru boyutu kullanacağından bu ayrıntı nadiren dikkate alınmalıdır.
"IntPtr" adı kafa karıştırıcı - benzer bir şey Handle
daha uygun olabilirdi. Benim ilk tahminim "IntPtr" bir tamsayı için bir işaretçi oldu . IntPtr MSDN belgelerine hiç isminin anlamı hakkında daha fazla fikir vermeden biraz şifreli ayrıntılı anlatır.
An IntPtr
, iki sınırlamaya sahip bir göstericidir:
Başka bir deyişle, an IntPtr
tıpkı bir void*
- gibidir, ancak temel işaretçi aritmetiği için kullanılabileceği (ancak olmaması gerektiği) ekstra özelliğiyle.
Bir referanstan vazgeçmek için IntPtr
, onu gerçek bir işaretçiye (yalnızca "güvenli olmayan" bağlamlarda gerçekleştirilebilen bir işlem) ya da InteropServices.Marshal
sınıf tarafından sağlananlar gibi yardımcı bir yordama iletebilirsiniz . Marshal
Sınıfın kullanılması, açık bir "güvensiz" bağlamda olmanızı gerektirmediği için güvenlik yanılsamasını verir. Ancak, işaretçiler kullanmanın doğasında olan çökme riskini ortadan kaldırmaz.
İşaretçi nedir?
Tüm dillerde, bir işaretçi bir bellek adresini saklayan bir değişken türüdür ve sizden size işaret ettikleri adresi veya işaret ettikleri adresteki değeri söylemelerini isteyebilirsiniz .
Bir işaretçi bir tür kitap işareti olarak düşünülebilir. Bir kitaptaki bir sayfaya hızlı bir şekilde atlamak için kullanılmak yerine, bellek bloklarını takip etmek veya eşlemek için bir işaretçi kullanılır.
Programınızın belleğini tam olarak 65535 baytlık büyük bir dizi gibi düşünün.
İşaretçiler itaatkar bir şekilde işaret ediyor
İşaretçiler her biri bir bellek adresini hatırlar ve bu nedenle her biri bellekteki tek bir adresi gösterir.
Grup olarak, işaretçiler bellek adreslerini hatırlar ve hatırlar, her müziğinize uyarlar.
Onların kralı sizsiniz.
İşaretçiler C #
Özellikle C # 'da, bir işaretçi, 0 ile 65534 arasında bir bellek adresi depolayan bir tamsayı değişkenidir.
Ayrıca C # 'a özgü işaretçiler int türündedir ve bu nedenle imzalanmıştır.
Negatif olarak numaralandırılmış adresleri kullanamazsınız, 65534'ün üzerindeki bir adrese de erişemezsiniz. Bunu yapmaya yönelik herhangi bir girişim bir System.AccessViolationException özel durumu oluşturur.
MyPointer adlı bir işaretçi şöyle bildirilir:
int * MyPointer;
C # 'daki bir işaretçi bir int'tir, ancak C #' daki bellek adresleri 0'dan başlar ve 65534'e kadar uzanır.
Sivri şeyler ekstra özel dikkatle ele alınmalıdır
Sözcük güvensiz olduğu sizi korkutmak için tasarlanmış, ve çok iyi bir nedenden dolayı: İşaretçiler ekstra büyük dikkatle ele alınmalıdır vb sivri şeyler ve sivri şeyler mesela kılıç, balta, işaretçileri vardır.
İşaretçiler programcıya bir sistemin sıkı denetimini sağlar. Bu nedenle, yapılan hataların daha ciddi sonuçları olacaktır.
İşaretçileri kullanmak için, programınızın özelliklerinde güvenli olmayan kodun etkinleştirilmesi ve işaretçilerin yalnızca güvenli olmayan olarak işaretlenmiş yöntemlerde veya bloklarda kullanılması gerekir.
Güvenli olmayan bir blok örneği
unsafe
{
// Place code carefully and responsibly here.
}
İşaretçiler nasıl kullanılır?
Değişkenler veya nesneler bildirildiğinde veya somutlaştırıldığında, bunlar bellekte saklanır.
int *MyPointer;
MyPointer = &MyVariable;
İşaretçiye bir adres atandığında, aşağıdakiler geçerlidir:
MyPointer = &MyVariable; // Set MyPointer to point at MyVariable
"MyPointer is pointing at " + *MyPointer;
İşaretçi bir bellek adresini tutan bir değişken olduğundan, bu bellek adresi bir işaretçi değişkeninde saklanabilir.
Dikkatli ve sorumlu bir şekilde kullanılan işaretçi örnekleri
public unsafe void PointerTest()
{
int x = 100; // Create a variable named x
int *MyPointer = &x; // Store the address of variable named x into the pointer named MyPointer
textBox1.Text = ((int)MyPointer).ToString(); // Displays the memory address stored in pointer named MyPointer
textBox2.Text = (*MyPointer).ToString(); // Displays the value of the variable named x via the pointer named MyPointer.
}
İşaretçinin türünün bir int olduğuna dikkat edin. Bunun nedeni, C # 'ın bellek adreslerini tamsayı (int) olarak yorumlamasıdır.
Neden uint yerine int?
Bunun iyi bir nedeni yok.
Neden işaretçiler kullanılır?
İşaretçiler çok eğlenceli. Bilgisayarın büyük bir kısmı bellek tarafından kontrol edildiğinde, işaretçiler bir programcıya programlarının belleğini daha fazla kontrol edebilmesini sağlar.
Bellek izleme.
Bellek bloklarını okumak ve değerlerin zaman içinde nasıl değiştiğine işaret etmek için işaretçiler kullanın.
Bu değerleri sorumlu bir şekilde değiştirin ve değişikliklerinizin bilgisayarınızı nasıl etkilediğini takip edin.
65534
bir işaretçi aralığı olarak çok yanlış görünüyor. Bir referans vermelisiniz.
System.IntPtr
. Sonunda güncellenen yanıtı görmek için de ne System.IntPtr
ve bir # nasıl güvensiz işaretçiler ile ilgili açıklayan görmek istiyorum .
MSDN bize şunları söylüyor:
IntPtr türü, boyutu platforma özgü bir tamsayı olacak şekilde tasarlanmıştır. Yani, bu tür bir örneğin 32 bit donanım ve işletim sistemlerinde 32 bit ve 64 bit donanım ve işletim sistemlerinde 64 bit olması beklenir.
IntPtr türü, işaretçileri destekleyen diller tarafından ve işaretçileri destekleyen ve desteklemeyen diller arasındaki verilere başvurmanın yaygın bir yolu olarak kullanılabilir.
IntPtr nesneleri tutamaçları tutmak için de kullanılabilir. Örneğin, IntPtr örnekleri System.IO.FileStream sınıfında dosya tanıtıcılarını tutmak için yaygın olarak kullanılır.
IntPtr türü CLS uyumludur, UIntPtr türü ise değildir. Ortak dil çalışma zamanında yalnızca IntPtr türü kullanılır. UIntPtr tipi çoğunlukla IntPtr tipi ile mimari simetriyi korumak için sağlanmıştır.
http://msdn.microsoft.com/en-us/library/system.intptr(VS.71).aspx
Bu, ilgilenen MSDN sayfasıIntPtr
.
İlk satır şöyle:
Bir işaretçiyi veya tanıtıcıyı temsil etmek için kullanılan platforma özgü bir tür.
İşaretçinin veya tutamacın ne olduğuna ilişkin olarak sayfa şu şekilde devam eder:
IntPtr türü, işaretçileri destekleyen diller tarafından ve işaretçileri destekleyen ve desteklemeyen diller arasındaki verilere başvurmanın yaygın bir yolu olarak kullanılabilir.
IntPtr nesneleri tutamaçları tutmak için de kullanılabilir. Örneğin, IntPtr örnekleri System.IO.FileStream sınıfında dosya tanıtıcılarını tutmak için yaygın olarak kullanılır.
İşaretçi, ilgilendiğiniz bazı verileri tutan bir bellek alanına yapılan başvurudur.
Tanıtıcı bir nesne için tanımlayıcı olabilir ve her iki tarafın da o nesneye erişmesi gerektiğinde yöntemler / sınıflar arasında iletilir.
An IntPtr
, öncelikle bellek adreslerini veya tanıtıcıları tutmak için kullanılan bir değer türüdür . Bir gösterici , bir bellek adresi. Bir işaretçi yazılabilir (örneğin int*
) veya türsüz olabilir (örneğin void*
). Bir tanıtıcı Windows genellikle bir bellek adresi ile aynı boyutta (veya daha küçük) ve (bir dosya ya da pencere gibi), bir sistem kaynağı temsil eden bir değerdir.