IntPtr.Zero эквивалентно нулю? - PullRequest
       22

IntPtr.Zero эквивалентно нулю?

56 голосов
/ 22 сентября 2009

Я пытаюсь настроить ReadFile для асинхронной работы и в соответствии с MSDN мне нужно установить lpNumberOfBytesRead на null:

"Используйте NULL для этого параметра, если это асинхронная операция, чтобы избежать потенциально ошибочных результатов."

Например, если у меня есть следующее:

  [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
  );

и я называю это так (с намерением, чтобы 4-й параметр был нулевым):

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

это будет то же самое, что назвать его с нулем? Если нет, что я должен изменить в объявлении или в самом вызове функции?

Мне также было любопытно, следует ли мне использовать SafeHandle или HandleRef вместо IntPtr для ссылки hFile? Я знаю, чтобы убедиться, что я закрываю ручку с CloseHandle(IntPtr), когда я закончу с этим, просто не уверен, есть ли какая-либо причина использовать две другие опции над IntPtr. Я также стараюсь избегать использования небезопасного кода.

РЕДАКТИРОВАТЬ: Как выясняется, я не должен был устанавливать четвертый параметр в IntPtr.Zero в любом случае, потому что, хотя я работаю асинхронно, он все равно может вернуться сразу же. См. Асинхронный дисковый ввод-вывод . Ах, я люблю противоречивые истории.

Ответы [ 3 ]

69 голосов
/ 22 сентября 2009

Для целей P / Invoke, подобных перечисленным, вы должны использовать IntPtr.Zero вместо NULL. Обратите внимание, что это не эквивалентно ключевому слову C # null, однако.

8 голосов
/ 22 сентября 2009

Нельзя присвоить значение null типу значения. Тип ссылки может быть нулевым, например, не ссылаясь на экземпляр объекта, но тип значения всегда имеет значение.

IntPtr.Zero - это просто постоянное значение, представляющее нулевой указатель.

7 голосов
/ 03 ноября 2011

Имейте в виду, что в C #> = 2.0 есть ошибка (функция ??), где

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

скомпилируется правильно, но никогда не войдет в if.

Я открыл проблему на github из roslyn , и они ответили, что не смогут это исправить, потому что есть проекты, созданные с предупреждениями как ошибки. Тем не менее, есть частичное исправление: есть режим компиляции strict, который генерирует это предупреждение:

<Features>strict</Features>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...