Questo articolo è stato tradotto automaticamente. Per visualizzare l'articolo in inglese, selezionare la casella di controllo Inglese. È possibile anche visualizzare il testo inglese in una finestra popup posizionando il puntatore del mouse sopra il testo.
Traduzione
Inglese

Struttura IntPtr

 

Un tipo specifico per una piattaforma utilizzato per rappresentare un puntatore o un handle.

Spazio dei nomi:   System
Assembly:  mscorlib (in mscorlib.dll)

[SerializableAttribute]
[ComVisibleAttribute(true)]
public struct IntPtr : ISerializable

NomeDescrizione
System_CAPS_pubmethodIntPtr(Int32)

Inizializza una nuova istanza di IntPtr usando il puntatore o handle a 32 bit specificato.

System_CAPS_pubmethodIntPtr(Int64)

Inizializza una nuova istanza di IntPtr usando il puntatore a 64 bit specificato.

System_CAPS_pubmethodIntPtr(Void*)

Inizializza una nuova istanza di IntPtr usando il puntatore specificato a un tipo non specificato.

NomeDescrizione
System_CAPS_pubpropertySystem_CAPS_staticSize

Ottiene la dimensione di questa istanza.

NomeDescrizione
System_CAPS_pubmethodSystem_CAPS_staticAdd(IntPtr, Int32)

Aggiunge un offset al valore di un puntatore.

System_CAPS_pubmethodEquals(Object)

Restituisce un valore che indica se questa istanza è uguale ad un oggetto specificato. (Esegue l’override di ValueType.Equals(Object)).

System_CAPS_pubmethodGetHashCode()

Restituisce il codice hash per questa istanza. (Esegue l’override di ValueType.GetHashCode()).

System_CAPS_pubmethodGetType()

Ottiene l'oggetto Type dell'istanza corrente.(Ereditato da Object.)

System_CAPS_pubmethodSystem_CAPS_staticSubtract(IntPtr, Int32)

Sottrae un offset dal valore di un puntatore.

System_CAPS_pubmethodToInt32()

Converte il valore di questa istanza in un numero intero con segno a 32 bit.

System_CAPS_pubmethodToInt64()

Converte il valore di questa istanza in un numero intero con segno a 64 bit.

System_CAPS_pubmethodToPointer()

Converte il valore di questa istanza in un puntatore ad un tipo non specificato.

System_CAPS_pubmethodToString()

Converte il valore numerico dell'oggetto IntPtr corrente nella rappresentazione di stringa equivalente.(Esegue l’override di ValueType.ToString()).

System_CAPS_pubmethodToString(String)

Converte il valore numerico dell'oggetto IntPtr corrente nella rappresentazione di stringa equivalente.

NomeDescrizione
System_CAPS_pubfieldSystem_CAPS_staticZero

Un campo di sola lettura che rappresenta un puntatore o un handle inizializzato a zero.

NomeDescrizione
System_CAPS_puboperatorSystem_CAPS_staticAddition(IntPtr, Int32)

Aggiunge un offset al valore di un puntatore.

System_CAPS_puboperatorSystem_CAPS_staticEquality(IntPtr, IntPtr)

Determina se due istanze specificate dell'oggetto IntPtr sono uguali.

System_CAPS_puboperatorSystem_CAPS_staticExplicit(Int32 to IntPtr)

Converte il valore di un intero con segno a 32 bit in un tipo IntPtr.

System_CAPS_puboperatorSystem_CAPS_staticExplicit(Int64 to IntPtr)

Converte il valore di un intero con segno a 64 bit in un tipo IntPtr.

System_CAPS_puboperatorSystem_CAPS_staticExplicit(IntPtr to Int32)

Converte il valore dell'oggetto IntPtr specificato in un intero con segno a 32 bit.

System_CAPS_puboperatorSystem_CAPS_staticExplicit(IntPtr to Int64)

Converte il valore dell'oggetto IntPtr specificato in un intero con segno a 64 bit.

System_CAPS_puboperatorSystem_CAPS_staticExplicit(IntPtr to Void*)

Converte il valore dell'oggetto IntPtr specificato in un puntatore a un tipo non specificato.

System_CAPS_puboperatorSystem_CAPS_staticExplicit(Void* to IntPtr)

Converte il puntatore specificato per un tipo non specificato in un oggetto IntPtr.

System_CAPS_puboperatorSystem_CAPS_staticInequality(IntPtr, IntPtr)

Determina se due istanze specificate dell'oggetto IntPtr non sono uguali.

System_CAPS_puboperatorSystem_CAPS_staticSubtraction(IntPtr, Int32)

Sottrae un offset dal valore di un puntatore.

NomeDescrizione
System_CAPS_pubinterfaceSystem_CAPS_privmethodISerializable.GetObjectData(SerializationInfo, StreamingContext)

Compila un oggetto SerializationInfo con i dati necessari per serializzare l'oggetto IntPtr corrente.

Il IntPtr tipo è progettato per essere un numero intero la cui dimensione è specifica della piattaforma. Ovvero un'istanza di questo tipo deve essere a 32 bit nei sistemi operativi e hardware a 32 bit e 64 bit nei sistemi operativi e hardware a 64 bit.

Il IntPtr tipo utilizzabile in linguaggi che supportano i puntatori e come strumento comune per fare riferimento ai dati tra i linguaggi che e puntatori non sono supportano.

IntPtr gli oggetti possono essere utilizzati anche per contenere gli handle. Ad esempio, le istanze di IntPtr sono ampiamente utilizzate nel System.IO.FileStream per contenere gli handle di file.

Il IntPtr tipo è conforme a CLS, mentre il UIntPtr tipo non è. Solo il IntPtr tipo viene utilizzato in common language runtime. Il UIntPtr tipo viene fornito principalmente allo scopo di mantenere la simmetria di architettura con il IntPtr tipo.

Questo tipo implementa il ISerializable interfaccia.

Nell'esempio seguente viene utilizzata puntatori gestiti per invertire i caratteri in una matrice. Dopo che inizializzato un String dell'oggetto e ottiene la lunghezza, esegue le operazioni seguenti:

  1. Chiamate di Marshal.StringToHGlobalAnsi metodo per copiare la stringa Unicode in memoria non gestita come carattere ANSI (un byte). Il metodo restituisce un IntPtr che punta all'inizio della stringa non gestita. Nell'esempio di Visual Basic utilizza questo puntatore direttamente. Negli esempi di C++ e c#, ne viene eseguito il cast a un puntatore a un byte.

  2. Chiamate di Marshal.AllocHGlobal per allocare lo stesso numero di byte come occupi una singola stringa non gestita. Il metodo restituisce un IntPtr che punta all'inizio del blocco di memoria non gestito. Nell'esempio di Visual Basic utilizza questo puntatore direttamente. Negli esempi di C++ e c#, ne viene eseguito il cast a un puntatore a un byte.

  3. Nell'esempio di Visual Basic definisce una variabile denominata offset che è uguale alla lunghezza della stringa ANSI. Viene utilizzato per determinare l'offset nella memoria non gestita a cui viene copiata la carta successiva della stringa ANSI. Poiché il valore iniziale è la lunghezza della stringa, l'operazione di copia copierà un carattere dall'inizio della stringa alla fine del blocco di memoria.

    La chiamata di esempi di c# e C++ di ToPointer per ottenere un puntatore all'indirizzo iniziale della stringa e il blocco di memoria non gestito e aggiungono una minore della lunghezza della stringa per l'indirizzo iniziale della stringa ANSI. Poiché il puntatore di stringa non gestita ora punta alla fine della stringa, l'operazione di copia copierà un carattere alla fine della stringa all'inizio del blocco di memoria.

  4. Utilizza un ciclo per copiare ogni carattere della stringa per il blocco di memoria non gestita.

    Nell'esempio Visual Basic viene chiamato il Marshal.ReadByte(IntPtr, Int32) metodo per leggere i byte (o carattere a un byte) in un offset specificato da un puntatore gestito a una stringa ANSI. L'offset viene incrementato a ogni iterazione del ciclo. Chiama quindi il Marshal.WriteByte(IntPtr, Int32, Byte) metodo per scrivere i byte per l'indirizzo di memoria definito dall'indirizzo iniziale del blocco non gestito di memoria più offset. Viene quindi decrementa offset.

    Esempi di C++ e c# eseguono l'operazione di copia, quindi diminuire il puntatore all'indirizzo di posizione successiva nella stringa ANSI non gestita e incrementano il puntatore al successivo indirizzo nel blocco non gestito.

  5. Tutti gli esempi di chiamare il Marshal.PtrToStringAnsi per convertire il blocco di memoria non gestita che contiene la stringa copiata ANSI a Unicode gestito String oggetto.

  6. Dopo aver visualizzato le stringhe originali e invertite, chiamare tutti gli esempi di FreeHGlobal metodo per liberare la memoria allocata per la stringa ANSI non gestita e il blocco di memoria non gestita.

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

Universal Windows Platform
Disponibile da 8
.NET Framework
Disponibile da 1.1
Portable Class Library
Supportato in: portable .NET platforms
Silverlight
Disponibile da 2.0
Windows Phone Silverlight
Disponibile da 7.0
Windows Phone
Disponibile da 8.1

Questo tipo è thread-safe.

Torna all'inizio
Mostra: