관리 언어인 C#의 독특한 특징 중 하나느느 기존 네이티브 C/C++ 언어와의 호환성을 위한 기능이
추가됐다는 점이다. Win32 API를 직접 호출할 수 있는 extern 예약어도 그러한 사례 중 하나다.
C/C++와의 호환성을 높이기 위해 존재하는 또 한 가지 사례가
바로 안전하지 않은 컨텍스트(unsafe context)에 대한 지원이다.
안전하지 않은 컨텍스트(문맥)란 안전하지 않은 코드를 포함한 영역을 의미하며,
안전하지 않은 코드란 포인터(pointer)를 사용하는 것을 의미한다.
간단히 말해서 C#은 C/C++ 언어의 포인터를 지원하며 unsafe 예약어는 포인터를 쓰는 코드를
포함하는 클래스나 그것의 멤버 또는 블록에 사용한다. 아래는 포인터 연산자(*, &)와 unsafe를
사용한 간단한 예제다.
unsafe static void GetAddResult(int* p, int a, int b)
{
*p = a + b;
}
static void Main(string[] args)
{
int i;
unsafe
{
GetAddResult(&i, 5, 10);
}
Console.WriteLine(i);
}
포인터 연산자(*, &)가 사용된 곳에는 반드시 unsafe 예약어를 지정해야 한다. 코드를 보면
GetAddResult 메서드는 포인터 형식의 인자를 받고 내부에 포인터 연산자(*)를 사용하는 코드가
있으므로 메서드 자체를 unsafe로 지정했다. 반면 Main 메서드에는 GetAddResult를 호출하는 부분
에만 포인터 연산자(&)를 사용하므로 블록을 지정해 unsafe를 적용한다.
unsafe 예약어를 사용한 코드는 반드시 컴파일러 옵션으로 /unsafe를 지정해야 한다.
c:\\temp\\ConsoleApp>csc /unsafe program.cs