2009-09-21 10 views
48

Je suis en train de configurer ReadFile pour exécuter de manière asynchrone et selon MSDN, je dois mettre lpNumberOfBytesRead à null:Est-ce que IntPtr.Zero est équivalent à null?

« Utiliser NULL pour ce paramètre si cela est une opération asynchrone pour éviter des résultats potentiellement erronés. »

Par exemple, si je donne les résultats suivants:

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
    public static extern bool ReadFile(
    IntPtr hFile, 
    out byte[] aBuffer, 
    int cbToRead, 
    IntPtr cbThatWereRead, 
    ref OVERLAPPED pOverlapped 
); 

et je l'appelle comme ça (avec l'intention d'avoir le 4ème paramètre étant null):

Win32API.ReadFile(readHandle, out data_read, Win32API.BUFFER_SIZE, IntPtr.Zero, ref over_lapped); 

volonté que être le même que l'appeler avec null? Si non, que dois-je changer dans la déclaration ou dans la fonction appeler elle-même?

J'étais aussi curieux de savoir si je devrais utiliser SafeHandle ou HandleRef au lieu de IntPtr pour la référence hFile? Je sais que je ferme la poignée avec CloseHandle(IntPtr) quand j'en ai fini, mais je ne sais pas s'il y a une autre raison pour utiliser les deux autres options sur IntPtr. Je tente également d'éviter d'utiliser un code dangereux.

EDIT: Comme il s'avère, je ne devrais pas mettre le quatrième paramètre à IntPtr.Zero de toute façon, parce que même si je cours de manière asynchrone, il pourrait encore revenir tout de suite. Voir Asynchronous Disk I/O. Ahh, j'aime les histoires contradictoires.

Répondre

60

À des fins P/Invoke comme vous l'avez indiqué, vous devez utiliser IntPtr.Zero à la place de NULL. Notez que ceci n'est pas équivalent au mot-clé C# null, cependant.

6

Vous ne pouvez pas affecter une valeur nulle à un type de valeur. Un type de référence peut être nul, comme dans, ne faisant pas référence à une instance d'objet, mais un type de valeur a toujours une valeur.

IntPtr.Zero est simplement une valeur constante qui représente un pointeur nul.

6

Soyez conscient qu'il ya un bug (fonction ??) en C#> = 2.0, où

if (IntPtr.Zero == null) 
{ 
    // Won't enter here 
} 

compilera correctement, mais il ne pourra jamais entrer dans le if.

Il y a un bogue ouvert sur le Microsoft connect mais il est assez ancien et il n'y a aucun commentaire du personnel de Microsoft.

+12

Désolé pour le post-retour, mais ce n'est pas un bug car IntPtr.Zero n'est pas égal à null - de sorte que si la déclaration ne fonctionnerait pas. – Kobunite

+0

@Kobunite Ensuite, essayez d'écrire 'if (IntPtr.Zero ==" Hello ")' et voyez ce qui se passe. Il y aura une erreur de compilation ... Le problème est qu'il n'y a aucun avertissement que la comparaison est impossible, et aucune erreur. Le code est simplement supprimé par le compilateur. Voir le code IL généré http://goo.gl/6zpPxN – xanatos

+0

Désolé pour necro, mais il compile, car il utilise efficacement la surcharge de l'opérateur '==' cast implicite comme '(IntPtr?) IntPtr.Zero == (IntPtr?) null' – Marc

Questions connexes