IntPtr.Zero는 null과 동일합니까?
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 번째 매개 변수가 null이되도록 의도).
Win32API.ReadFile(readHandle, out data_read, Win32API.BUFFER_SIZE, IntPtr.Zero, ref over_lapped);
null로 호출하는 것과 동일합니까? 그렇지 않다면 선언이나 함수 호출 자체에서 무엇을 변경해야합니까?
참조 용 으로 사용해야하는지 SafeHandle
아니면 HandleRef
대신 사용해야하는지 궁금합니다 . 나는 그것을 끝낼 때 핸들을 닫았 는지 확인하고 다른 두 옵션을 사용할 다른 이유가 있는지 확실하지 않습니다 . 또한 안전하지 않은 코드를 사용하지 않으려 고 노력하고 있습니다.IntPtr
hFile
CloseHandle(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
.
나는 roslyn 의 github에 대한 문제를 열었고 그들은 경고로 작성된 프로젝트가 있기 때문에 그것을 고치지 않을 것이라고 대답했습니다. 여전히 이것에 대한 부분적인 수정이 있습니다 : strict
이 경고를 생성 하는 컴파일 모드가 있습니다 :
<Features>strict</Features>
참고 URL : https://stackoverflow.com/questions/1456861/is-intptr-zero-equivalent-to-null
'Program Tip' 카테고리의 다른 글
React.js : JavaScript에서 jsx를 분리하는 방법 (0) | 2020.12.12 |
---|---|
.NET 용 OK 이미지 인식 라이브러리가 있습니까? (0) | 2020.12.12 |
특정 크기의 플롯 창 만들기 (0) | 2020.12.12 |
Python : 객체가 시퀀스인지 확인 (0) | 2020.12.12 |
텍스트 하이라이트 이벤트? (0) | 2020.12.12 |