IntPtr.Zero est-il équivalent à null?

J’essaie de configurer ReadFile pour une exécution asynchrone et selon MSDN , je dois définir lpNumberOfBytesRead sur null :

“Utilisez NULL pour ce paramètre s’il s’agit d’une opération asynchrone afin d’éviter des résultats potentiellement erronés.”

Par exemple, si j’ai les éléments 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 nul):

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

Sera-ce la même chose que de l’appeler avec null? Si non, que dois-je changer dans la déclaration ou dans l’appel de la fonction elle-même?

J’étais aussi curieux de savoir si je devais utiliser SafeHandle ou HandleRef au lieu de IntPtr pour la référence hFile ? Je sais que je dois fermer le handle avec CloseHandle(IntPtr) lorsque j’en ai fini avec moi, mais je ne sais pas s’il existe une autre raison d’utiliser les deux autres options sur IntPtr . J’essaie également d’éviter d’utiliser du code dangereux.

EDIT: En fait, je ne IntPtr.Zero pas définir le quasortingème paramètre sur IntPtr.Zero , car même si je fonctionne de manière asynchrone, il pourrait toujours revenir immédiatement. Voir E / S sur disque asynchrone . Ahh, j’adore contredire les histoires.

Pour les objectives P / Invoke, comme vous l’avez indiqué, vous devez utiliser IntPtr.Zero à la place de NULL . Notez toutefois que ce n’est pas équivalent au mot clé C # null .

Vous ne pouvez pas affecter NULL à un type de valeur. Un type de référence peut être null, comme dans, sans faire référence à une instance d’object, mais un type de valeur a toujours une valeur.

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

Sachez qu’il y a un bug (feature ??) dans C #> = 2.0, où

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

va comstackr correctement, mais il ne sera jamais entré dans le if .

J’ai ouvert un numéro sur le github de roslyn et ils ont répondu qu’ils ne le répareraient pas car il y a des projets construits avec des avertissements en tant qu’erreurs. Il existe toujours une solution partielle à ce problème: il existe un mode de compilation ssortingct qui génère cet avertissement:

 ssortingct