Program Tip

IntPtr.Zero는 null과 동일합니까?

programtip 2020. 12. 12. 12:19
반응형

IntPtr.Zero는 null과 동일합니까?


ReadFile비동기 적으로 실행되도록 설정하려고하는데 MSDN 에 따라 다음 lpNumberOfBytesReadnull같이 설정해야 합니다 .

"잠재적으로 잘못된 결과를 방지하기 위해 비동기 작업 인 경우이 매개 변수에 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 번째 매개 변수가 null이되도록 의도).

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

null로 호출하는 것과 동일합니까? 그렇지 않다면 선언이나 함수 호출 자체에서 무엇을 변경해야합니까?

참조 으로 사용해야하는지 SafeHandle아니면 HandleRef대신 사용해야하는지 궁금합니다 . 나는 그것을 끝낼 때 핸들을 닫았 는지 확인하고 다른 두 옵션을 사용할 다른 이유가 있는지 확실하지 않습니다 . 또한 안전하지 않은 코드를 사용하지 않으려 고 노력하고 있습니다.IntPtrhFileCloseHandle(IntPtr)IntPtr

편집 : IntPtr.Zero내가 비동기 적으로 실행하더라도 여전히 즉시 반환 할 수 있기 때문에 네 번째 매개 변수를 어쨌든 설정해서는 안됩니다 . 비동기 디스크 I / O를 참조하십시오 . 아, 나는 모순되는 이야기를 좋아합니다.


나열된 것과 같은 P / Invoke 목적 IntPtr.Zero의 경우 NULL. null그러나 이것은 C # 키워드 와 동일하지 않습니다 .


값 유형에 널을 지정할 수 없습니다. 참조 유형은 객체 인스턴스를 참조하지 않는 것처럼 null 일 수 있지만 값 유형에는 항상 값이 있습니다.

IntPtr.Zero는 null 포인터를 나타내는 상수 값입니다.


C #> = 2.0에는 버그 (기능 ??)가 있습니다. 여기서

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

올바르게 컴파일되지만 if.

나는 roslyngithub에 대한 문제를 열었고 그들은 경고로 작성된 프로젝트가 있기 때문에 그것을 고치지 않을 것이라고 대답했습니다. 여전히 이것에 대한 부분적인 수정이 있습니다 : strict이 경고를 생성 하는 컴파일 모드가 있습니다 :

<Features>strict</Features>

참고 URL : https://stackoverflow.com/questions/1456861/is-intptr-zero-equivalent-to-null

반응형