IntPtr Yapı

Tanım

Bir işaretçiyi veya tanıtıcıyı temsil etmek için kullanılan platforma özgü bir tür.A platform-specific type that is used to represent a pointer or a handle.

public value class IntPtr
public value class IntPtr : IComparable, IComparable<IntPtr>, IEquatable<IntPtr>, IFormattable, System::Runtime::Serialization::ISerializable
public value class IntPtr : IEquatable<IntPtr>, System::Runtime::Serialization::ISerializable
public value class IntPtr : System::Runtime::Serialization::ISerializable
public struct IntPtr
public struct IntPtr : IComparable, IComparable<IntPtr>, IEquatable<IntPtr>, IFormattable, System.Runtime.Serialization.ISerializable
public struct IntPtr : IEquatable<IntPtr>, System.Runtime.Serialization.ISerializable
[System.Serializable]
public struct IntPtr : System.Runtime.Serialization.ISerializable
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public struct IntPtr : System.Runtime.Serialization.ISerializable
public struct IntPtr : System.Runtime.Serialization.ISerializable
type nativeint = struct
type nativeint = struct
    interface IFormattable
    interface ISerializable
type nativeint = struct
    interface ISerializable
[<System.Serializable>]
type nativeint = struct
    interface ISerializable
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type nativeint = struct
    interface ISerializable
Public Structure IntPtr
Public Structure IntPtr
Implements IComparable, IComparable(Of IntPtr), IEquatable(Of IntPtr), IFormattable, ISerializable
Public Structure IntPtr
Implements IEquatable(Of IntPtr), ISerializable
Public Structure IntPtr
Implements ISerializable
Devralma
IntPtr
Öznitelikler
Uygulamalar

Örnekler

Aşağıdaki örnek, bir dizideki karakterleri tersine çevirmek için yönetilen işaretçiler kullanır.The following example uses managed pointers to reverse the characters in an array. Bir String nesneyi başlattıktan ve uzunluğunu aldığından, şunları yapar:After it initializes a String object and gets its length, it does the following:

  1. Marshal.StringToHGlobalAnsiUnicode dizesini BIR ANSI (tek bayt) karakteri olarak yönetilmeyen belleğe kopyalamak için yöntemini çağırır.Calls the Marshal.StringToHGlobalAnsi method to copy the Unicode string to unmanaged memory as an ANSI (one-byte) character. Yöntemi, IntPtr yönetilmeyen dizenin başlangıcına işaret eden bir nesne döndürür.The method returns an IntPtr object that points to the beginning of the unmanaged string. Visual Basic örnek bu işaretçiyi doğrudan kullanır; C++ ve C# örneklerinde, bir bayta bir işaretçiye atama yapılır.The Visual Basic example uses this pointer directly; in the C++ and C# examples, it is cast to a pointer to a byte.

  2. Marshal.AllocHGlobalYönetilmeyen dizenin kapladığı bayt sayısını ayırmak için yöntemini çağırır.Calls the Marshal.AllocHGlobal method to allocate the same number of bytes as the unmanaged string occupies. Yöntemi, IntPtr yönetilmeyen bellek bloğunun başlangıcına işaret eden bir nesne döndürür.The method returns an IntPtr object that points to the beginning of the unmanaged block of memory. Visual Basic örnek bu işaretçiyi doğrudan kullanır; C++ ve C# örneklerinde, bir bayta bir işaretçiye atama yapılır.The Visual Basic example uses this pointer directly; in the C++ and C# examples, it is cast to a pointer to a byte.

  3. Visual Basic örnek, offset ANSI dizesinin uzunluğuna eşit olan adlı bir değişkeni tanımlar.The Visual Basic example defines a variable named offset that is equal to the length of the ANSI string. ANSI dizesindeki sonraki karakterin kopyalandığı yönetilmeyen belleğin sapmasını belirlemekte kullanılır.It is used to determine the offset into unmanaged memory to which the next character in the ANSI string is copied. Başlangıç değeri dizenin uzunluğu olduğundan, kopyalama işlemi dizenin başından bellek bloğunun sonuna kadar bir karakter kopyalayacaktır.Because its starting value is the length of the string, the copy operation will copy a character from the start of the string to the end of the memory block.

    C# ve C++ örnekleri, ToPointer dizenin başlangıç adresine ve yönetilmeyen bellek bloğuna yönetilmeyen bir işaretçi almak için yöntemini çağırır ve dize uzunluğundan bir daha az ANSI dizesinin başlangıç adresine ekler.The C# and C++ examples call the ToPointer method to get an unmanaged pointer to the starting address of the string and the unmanaged block of memory, and they add one less than the length of the string to the starting address of the ANSI string. Yönetilmeyen dize işaretçisi artık dizenin sonuna işaret ettiğinden, kopyalama işlemi dizenin sonundan bellek bloğunun başlangıcına kadar bir karakter kopyalayacaktır.Because the unmanaged string pointer now points to the end of the string, the copy operation will copy a character from the end of the string to the start of the memory block.

  4. Her karakteri dizeden yönetilmeyen bellek bloğuna kopyalamak için bir döngü kullanır.Uses a loop to copy each character from the string to the unmanaged block of memory.

    Visual Basic örnek, Marshal.ReadByte(IntPtr, Int32) yönetilen IŞARETÇIDEN ANSI dizesine kadar belirtilen bir uzaklığında bayt (veya bir baytlık karakter) okumak için yöntemini çağırır.The Visual Basic example calls the Marshal.ReadByte(IntPtr, Int32) method to read the byte (or one-byte character) at a specified offset from the managed pointer to the ANSI string. Döngünün her tekrarında, fark artırılır.The offset is incremented with each iteration of the loop. Daha sonra, Marshal.WriteByte(IntPtr, Int32, Byte) yönetilmeyen bellek bloğunun başlangıç adresi ile tanımlanan bellek adresine bayt yazmak için yöntemini çağırır ve offset .It then calls the Marshal.WriteByte(IntPtr, Int32, Byte) method to write the byte to the memory address defined by the starting address of the unmanaged block of memory plus offset. Daha sonra azaltır offset .It then decrements offset.

    C# ve C++ örnekleri kopyalama işlemini gerçekleştirir, sonra işaretçiyi yönetilmeyen ANSI dizesindeki sonraki konumun adresine azaltır ve işaretçiyi yönetilmeyen bloktaki sonraki adrese göre artırır.The C# and C++ examples perform the copy operation, then decrement the pointer to the address of the next location in the unmanaged ANSI string and increment the pointer to the next address in the unmanaged block.

  5. Tüm örnekler, Marshal.PtrToStringAnsi KOPYALANMıŞ ANSI dizesini içeren yönetilmeyen bellek bloğunu yönetilen bir Unicode nesnesine dönüştürmek için ' i çağırır String .All examples call the Marshal.PtrToStringAnsi to convert the unmanaged memory block containing the copied ANSI string to a managed Unicode String object.

  6. Özgün ve tersine çevrilmiş dizeleri görüntülendikten sonra, tüm örnekler FreeHGlobal YÖNETILMEYEN ANSI dizesine ayrılan belleği ve yönetilmeyen bellek bloğunu serbest bırakmak için yöntemini çağırır.After displaying the original and reversed strings, all examples call the FreeHGlobal method to free the memory allocated for the unmanaged ANSI string and the unmanaged block of memory.

using namespace System;
using namespace System::Runtime::InteropServices;

class NotTooSafeStringReverse
{
public:
    static void Main()
    {
        String^ stringA = "I seem to be turned around!";
        int copylen = stringA->Length;

        // Allocate HGlobal memory for source and destination strings
        IntPtr sptr = Marshal::StringToHGlobalAnsi(stringA);
        IntPtr dptr = Marshal::AllocHGlobal(copylen + 1);

        char *src = (char *)sptr.ToPointer();
        char *dst = (char *)dptr.ToPointer();

        if (copylen > 0)
        {
            // set the source pointer to the end of the string
            // to do a reverse copy.
            src += copylen - 1;

            while (copylen-- > 0)
            {
                *dst++ = *src--;
            }
            *dst = 0;
        }
        String^ stringB = Marshal::PtrToStringAnsi(dptr);

        Console::WriteLine("Original:\n{0}\n", stringA);
        Console::WriteLine("Reversed:\n{0}", stringB);

        // Free HGlobal memory
        Marshal::FreeHGlobal(dptr);
        Marshal::FreeHGlobal(sptr);
    }
};

int main()
{
    NotTooSafeStringReverse::Main();
}

// The progam has the following output:
//
// Original:
// I seem to be turned around!
//
// Reversed:
// !dnuora denrut eb ot mees I
using System;
using System.Runtime.InteropServices;

class NotTooSafeStringReverse
{
    static public void Main()
    {
        string stringA = "I seem to be turned around!";
        int copylen = stringA.Length;

        // Allocate HGlobal memory for source and destination strings
        IntPtr sptr = Marshal.StringToHGlobalAnsi(stringA);
        IntPtr dptr = Marshal.AllocHGlobal(copylen + 1);

        // The unsafe section where byte pointers are used.
        unsafe
        {
            byte *src = (byte *)sptr.ToPointer();
            byte *dst = (byte *)dptr.ToPointer();

            if (copylen > 0)
            {
                // set the source pointer to the end of the string
                // to do a reverse copy.
                src += copylen - 1;

                while (copylen-- > 0)
                {
                    *dst++ = *src--;
                }
                *dst = 0;
            }
        }
        string stringB = Marshal.PtrToStringAnsi(dptr);

        Console.WriteLine("Original:\n{0}\n", stringA);
        Console.WriteLine("Reversed:\n{0}", stringB);

        // Free HGlobal memory
        Marshal.FreeHGlobal(dptr);
        Marshal.FreeHGlobal(sptr);
    }
}

// The progam has the following output:
//
// Original:
// I seem to be turned around!
//
// Reversed:
// !dnuora denrut eb ot mees I
Imports System.Runtime.InteropServices

Public Module Example
    Public Sub Main()
        Dim stringA As String = "I seem to be turned around!"
        Dim copylen As Integer = stringA.Length

        ' Allocate HGlobal memory for source and destination strings
        Dim sptr As IntPtr = Marshal.StringToHGlobalAnsi(stringA)
        Dim dptr As IntPtr = Marshal.AllocHGlobal(copylen)
        Dim offset As Integer = copylen - 1

         For ctr As Integer = 0 To copylen - 1
            Dim b As Byte = Marshal.ReadByte(sptr, ctr)
            Marshal.WriteByte(dptr, offset, b)
            offset -= 1
         Next

        Dim stringB As String = Marshal.PtrToStringAnsi(dptr)

        Console.WriteLine("Original:{1}{0}{1}", stringA, vbCrLf)
        Console.WriteLine("Reversed:{1}{0}{1}", stringB, vbCrLf)

        ' Free HGlobal memory
        Marshal.FreeHGlobal(dptr)
        Marshal.FreeHGlobal(sptr)
    End Sub
End Module
' The example displays the following output:
'       Original:
'       I seem to be turned around!
'
'       Reversed:
'       !dnuora denrut eb ot mees I

Açıklamalar

IntPtrTürü, boyutu platforma özgü olan bir tamsayı olacak şekilde tasarlanmıştır.The IntPtr type is designed to be an integer whose size is platform-specific. Diğer bir deyişle, bu türün bir örneğinin 32 bit donanım ve işletim sistemlerinde 32 bit olması ve 64 bit donanım ve işletim sistemlerinde 64-bit olması beklenir.That is, an instance of this type is expected to be 32-bits on 32-bit hardware and operating systems, and 64-bits on 64-bit hardware and operating systems.

Türü, işaretçileri destekleyen IntPtr Diller ve işaretçileri desteklemeyen diller arasındaki verilere başvuran yaygın bir yöntem olarak kullanılabilir.The IntPtr type can be used by languages that support pointers and as a common means of referring to data between languages that do and do not support pointers.

IntPtr nesneler, tutamaçları tutmak için de kullanılabilir.IntPtr objects can also be used to hold handles. Örneğin, örnekleri, IntPtr System.IO.FileStream Dosya tutamaçlarını tutmak için sınıfında yaygın olarak kullanılır.For example, instances of IntPtr are used extensively in the System.IO.FileStream class to hold file handles.

Tür IntPtr CLS uyumluysa tür UIntPtr değildir.The IntPtr type is CLS-compliant, while the UIntPtr type is not. Yalnızca IntPtr tür ortak dil çalışma zamanında kullanılır.Only the IntPtr type is used in the common language runtime. UIntPtrTürü, genellikle türü ile mimari simetriyi sürdürmek için sağlanır IntPtr .The UIntPtr type is provided mostly to maintain architectural symmetry with the IntPtr type.

Bu tür, ISerializable ve, .net 5,0 ve üzeri sürümlerde IFormattable arabirimlerini uygular.This type implements the ISerializable, and, in .NET 5.0 and later, the IFormattable interfaces.

Oluşturucular

IntPtr(Int32)

IntPtrBelirtilen 32 bitlik işaretçiyi veya tanıtıcıyı kullanarak yeni bir örneğini başlatır.Initializes a new instance of IntPtr using the specified 32-bit pointer or handle.

IntPtr(Int64)

IntPtrBelirtilen 64 bitlik işaretçiyi kullanarak yeni bir örneğini başlatır.Initializes a new instance of IntPtr using the specified 64-bit pointer.

IntPtr(Void*)

IntPtrBelirtilmemiş bir tür için belirtilen işaretçinin kullanıldığı yeni bir örneğini başlatır.Initializes a new instance of IntPtr using the specified pointer to an unspecified type.

Alanlar

Zero

Sıfıra başlatılmış bir işaretçiyi veya tanıtıcıyı temsil eden salt okunurdur bir alan.A read-only field that represents a pointer or handle that has been initialized to zero.

Özellikler

MaxValue

Olası en büyük değeri temsil eder IntPtr .Represents the largest possible value of IntPtr.

MinValue

Olası en küçük değeri temsil eder IntPtr .Represents the smallest possible value of IntPtr.

Size

Bu örneğin boyutunu alır.Gets the size of this instance.

Yöntemler

Add(IntPtr, Int32)

Bir işaretçinin değerine bir konum ekler.Adds an offset to the value of a pointer.

CompareTo(IntPtr)

Mevcut örneği aynı türdeki başka bir nesne ile karşılaştırır ve geçerli örneğin, diğer nesneyle aynı sıralama düzeni konumunda mı olduğunu, önünde mi olduğunu, yoksa arkasında mı olduğunu belirten bir tamsayı döndürür.Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object.

CompareTo(Object)

Mevcut örneği aynı türdeki başka bir nesne ile karşılaştırır ve geçerli örneğin, diğer nesneyle aynı sıralama düzeni konumunda mı olduğunu, önünde mi olduğunu, yoksa arkasında mı olduğunu belirten bir tamsayı döndürür.Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object.

Equals(IntPtr)

Geçerli nesnenin aynı türdeki başka bir nesneye eşit olup olmadığını gösterir.Indicates whether the current object is equal to another object of the same type.

Equals(Object)

Bu örneğin, belirtilen bir nesneye eşit olup olmadığını gösteren bir değeri döndürür.Returns a value indicating whether this instance is equal to a specified object.

GetHashCode()

Bu örneğe ilişkin karma kodu döndürür.Returns the hash code for this instance.

Parse(String)

Bir sayının dize gösterimini, imzalanan yerel tamsayı eşdeğerine dönüştürür.Converts the string representation of a number to its signed native integer equivalent.

Parse(String, IFormatProvider)

Belirli bir kültüre özgü biçimdeki bir sayının dize gösterimini, imzalanan yerel tamsayı eşdeğerine dönüştürür.Converts the string representation of a number in a specified culture-specific format to its signed native integer equivalent.

Parse(String, NumberStyles)

Belirtilen bir stildeki bir sayının dize gösterimini, imzalanan yerel tamsayı eşdeğerine dönüştürür.Converts the string representation of a number in a specified style to its signed native integer equivalent.

Parse(String, NumberStyles, IFormatProvider)

Belirtilen bir stil ve kültüre özgü biçimdeki bir sayının dize gösterimini, imzalanan yerel tamsayı eşdeğerine dönüştürür.Converts the string representation of a number in a specified style and culture-specific format to its signed native integer equivalent.

Subtract(IntPtr, Int32)

Bir işaretçinin değerindeki bir sapmayı çıkartır.Subtracts an offset from the value of a pointer.

ToInt32()

Bu örneğin değerini 32 bitlik işaretli bir tamsayıya dönüştürür.Converts the value of this instance to a 32-bit signed integer.

ToInt64()

Bu örneğin değerini 64 bitlik işaretli bir tamsayıya dönüştürür.Converts the value of this instance to a 64-bit signed integer.

ToPointer()

Bu örneğin değerini, belirtilmeyen bir türe bir işaretçiye dönüştürür.Converts the value of this instance to a pointer to an unspecified type.

ToString()

Geçerli nesnenin sayısal değerini IntPtr eşdeğer dize gösterimine dönüştürür.Converts the numeric value of the current IntPtr object to its equivalent string representation.

ToString(IFormatProvider)

Bu örneğin sayısal değerini belirtilen biçim ve kültüre özgü biçim bilgilerini kullanarak eşdeğer dize gösterimine dönüştürür.Converts the numeric value of this instance to its equivalent string representation using the specified format and culture-specific format information.

ToString(String)

Geçerli nesnenin sayısal değerini IntPtr eşdeğer dize gösterimine dönüştürür.Converts the numeric value of the current IntPtr object to its equivalent string representation.

ToString(String, IFormatProvider)

Geçerli örneğin değerini belirtilen biçimi kullanarak biçimlendirir.Formats the value of the current instance using the specified format.

TryParse(String, IntPtr)

Bir sayının dize gösterimini, imzalanan yerel tamsayı eşdeğerine dönüştürür.Converts the string representation of a number to its signed native integer equivalent. Dönüş değeri dönüştürmenin başarılı olup olmadığını gösterir.A return value indicates whether the conversion succeeded.

TryParse(String, NumberStyles, IFormatProvider, IntPtr)

Belirtilen bir stil ve kültüre özgü biçimdeki bir sayının dize gösterimini, imzalanan yerel tamsayı eşdeğerine dönüştürür.Converts the string representation of a number in a specified style and culture-specific format to its signed native integer equivalent. Dönüş değeri dönüştürmenin başarılı olup olmadığını gösterir.A return value indicates whether the conversion succeeded.

İşleçler

Addition(IntPtr, Int32)

Bir işaretçinin değerine bir konum ekler.Adds an offset to the value of a pointer.

Equality(IntPtr, IntPtr)

Belirtilen iki IntPtr örneğinin eşit olup olmadığını belirler.Determines whether two specified instances of IntPtr are equal.

Explicit(Int32 to IntPtr)

32 bitlik işaretli tamsayının değerini bir öğesine dönüştürür IntPtr .Converts the value of a 32-bit signed integer to an IntPtr.

Explicit(Int64 to IntPtr)

64 bitlik işaretli tamsayının değerini bir öğesine dönüştürür IntPtr .Converts the value of a 64-bit signed integer to an IntPtr.

Explicit(IntPtr to Int32)

Belirtilen değerini IntPtr 32 bitlik işaretli tamsayıya dönüştürür.Converts the value of the specified IntPtr to a 32-bit signed integer.

Explicit(IntPtr to Int64)

Belirtilen değerini IntPtr 64 bitlik işaretli tamsayıya dönüştürür.Converts the value of the specified IntPtr to a 64-bit signed integer.

Explicit(IntPtr to Void*)

Belirtilen değerini IntPtr bir işaretçiye belirtilmemiş bir türe dönüştürür.Converts the value of the specified IntPtr to a pointer to an unspecified type.

Bu API, CLS uyumlu değildir.This API is not CLS-compliant.

Explicit(Void* to IntPtr)

Belirtilen işaretçiyi belirtilmemiş bir türe dönüştürür IntPtr .Converts the specified pointer to an unspecified type to an IntPtr.

Bu API, CLS uyumlu değildir.This API is not CLS-compliant.

Inequality(IntPtr, IntPtr)

Belirtilen iki IntPtr örneğinin eşit olup olmadığını belirler.Determines whether two specified instances of IntPtr are not equal.

Subtraction(IntPtr, Int32)

Bir işaretçinin değerindeki bir sapmayı çıkartır.Subtracts an offset from the value of a pointer.

Belirtik Arabirim Kullanımları

IEquatable<IntPtr>.Equals(IntPtr)

Bu örneğin başka bir işaretli tamsayı işaretçisine eşit olup olmadığını gösteren bir değer döndürür.Returns a value that indicates whether this instance is equal to another signed integer pointer.

ISerializable.GetObjectData(SerializationInfo, StreamingContext)

SerializationInfoGeçerli nesneyi seri hale getirmek için gereken verileri içeren bir nesneyi doldurur IntPtr .Populates a SerializationInfo object with the data needed to serialize the current IntPtr object.

Şunlara uygulanır

İş Parçacığı Güvenliği

Bu güvenli iş parçacığı türüdür.This type is thread safe.

Ayrıca bkz.