안전하지 않은 코드의 제한 사항은 C#입니까? 예를 들어, C 또는 C++을 사용하는 것처럼 사실상 임의의 포인터 캐스트 및 산술을 수행 할 수 있습니까?C#의 안전하지 않은 코드
답변
예. 안전하지 않은 상태 인 경우 All bets are off
검증 할 수있는 유형의 "안전성"이 제거되었으며 런타임이 없으면 한 유형의 포인터에서 다른 유형의 포인터로 변환 할 수 있습니다. shooting yourself in the foot 그래서 욕망 - C 또는 C++과 매우 비슷합니다. 여기
는 C#으로 다른 포인터 타입을 사용의 예 : 배열의 유형Byte[]
입니다
fixed (Byte* dstBytes = ¤tImage[0])
{
var dstBuffer = (Int64*)dstBytes;
const int blockCount = ImageSizeInBytes/sizeof(Int64);
for (var j = 0; j < blockCount; j++)
{
dstBuffer[j] = srcBuffer[j];
}
}
참고,하지만 난 Byte*
를 얻을 후 나는 Int64*
에 캐스팅과에서 8 바이트로 작업 할 수 있습니다 시각.
예, 원하는 곳에 포인터를 지정할 수 있습니다.
그러나 프로그램이 가상 주소 공간에서 실행 중이므로 해당 공간에 실제로 존재하는 메모리에만 액세스 할 수 있습니다. 즉, 다른 프로세스에 액세스 할 수 없으며 ' t 할당되었습니다.
당신은 자세한 내용은 다음 페이지를 참조 할 수 있습니다
http://msdn.microsoft.com/en-us/library/y31yhkeb.aspx
안전하지 않은 코드는 거의 모든 원시 변수 (기본 유형) 포인터를 선언 할 수있는 기능을 제공합니다; 당신은 포인터 타입들 사이에서 캐스트 할 수 있습니다. 포인터 산술은 포인터 유형의 저장소 크기를 기반으로하므로 포인터에 후 증가 또는 후 감소를 적용하면 sizeof (유형)에 따라 주소가 증가합니다.
예, 가능합니다. MSDN의 Unsafe Code Tutorial은 다음과 같습니다.
이 모든 것을 사용하는 방법은 끔찍한 생각입니다. 예,하지만 이유가 있습니다. 저는 최근에 (처음으로) Byte *
을 반환 한 타사 API를 통해 웹캠 데이터를 가져와야했습니다.
+1 링크 용으로 (그리고 좋은 대답). – Sam