포인터를 사용하면 CLR에서 안전성을 책임지지 못하고, 불완전한 코드가 된다고 하며 에러를 발생하는데, 이렇게 예전 코드를 사용해야 할 경우, 빌드 속성을 변경해줌으로써 unsafe 코드를 사용 할 수 있다.
사용 방법
형식 또는 멤버 선언에서 unsafe 한정자를 사용할 수 있으며, 이렇게 선언해줄 경우 안전하지 않은 컨텍스트로 간주된다.
fixed 지시어는 unsafe 컨텍스트에서만 허용된다.
클래스가 인스턴스화 되면 CLR에 의해 언제든지 메모리가 이동 될 수 있는데, fixed 지시어를 이용하면 해당 코드에 들어간 변수 및 객체는 가비지 콜렉팅이 발생할 때 주소 재배치 대상이 아니게 된다.
unsafe private uint reload()
{
uint s0 = 0, s1 = 0;
int j = 0;
fixed (uint* p0 = &mt_state[0])
{
uint* pS = p0;
uint* p1 = p0;
... 중략 ...
s1 = mt_state[0];
s1 ^= (s1 >> 11);
s1 ^= (s1 << 7) & 0x9D2C5680;
s1 ^= (s1 << 15) & 0xEFC60000;
}
return (s1 ^ (s1 >> 18));
}
빌드 속성
unsafe 한정자를 사용할 경우에는 안전하지 않은 코드 허용(F) 를 체크해야지만, 빌드 오류가 나지 않는다.
'프로그래밍 언어 > C#' 카테고리의 다른 글
[C#] Attribute : Obsolete - 더 이상 사용하지 않거나 그럴 예정인 코드에 대해서 (0) | 2024.12.16 |
---|---|
[C#] IsNullOrEmpty와 IsNullOrWhiteSpace의 차이점 (0) | 2024.11.10 |
[C#] Marshal (0) | 2024.05.22 |
[C#] 관리되는, 관리되지 않는 코드 (0) | 2024.05.22 |
[C#] DLL 파일 생성, 참조하는 법 (0) | 2024.05.22 |