unsafe 키워드

unsafe 키워드 (C# 참조)

포인터를 다루는 연산이라면 빠짐없이 필요한 게 하나 있어요. 바로 안전하지 않은 컨텍스트(unsafe context)죠. unsafe 키워드는 그 컨텍스트를 만들어 주는 역할을 해요. 자세한 내용은 안전하지 않은 코드와 포인터 문서에서 다뤄요. C#에 처음 도입된 시점부터 함께해 온 키워드니까, 버전 걱정 없이 그대로 쓸 수 있어요.

출처: unsafe keyword - C# Reference

본문

타입이나 멤버를 선언할 때 unsafe 수정자를 붙이면, 그 타입이나 멤버의 텍스트 전체가 안전하지 않은 컨텍스트가 돼요. 예를 들어 다음 메서드는 unsafe 수정자를 붙여 선언했어요.

unsafe static void FastCopy(byte[] src, byte[] dst, int count)
{
    // Unsafe context: can use pointers here.
}

이 컨텍스트의 범위는 매개 변수 목록부터 메서드 끝까지 이어져요. 그래서 매개 변수 목록에서도 포인터를 쓸 수 있죠.

unsafe static void FastCopy ( byte* ps, byte* pd, int count ) {...}

안전하지 않은 코드를 블록 안에서만 쓰고 싶다면, unsafe 블록을 써서 그 블록 안에서만 컨텍스트를 켤 수도 있어요.

unsafe
{
    // Unsafe context: can use pointers here.
}

안전하지 않은 코드를 컴파일하려면 AllowUnsafeBlocks 컴파일러 옵션을 지정해야 해요. 공용 언어 런타임(CLR)은 안전하지 않은 코드를 검증할 수 없기 때문이에요.

[!NOTE] C# 15에 도입된 메모리 안전성 미리 보기 기능은 unsafe 컨텍스트가 필요한 연산을 좁혀 줘요. 포인터를 만들거나, fixed 문을 쓰거나, stackalloc 식을 포인터로 변환하거나, 비관리형 타입에 sizeof를 쓰는 일에는 더 이상 unsafe 컨텍스트가 필요 없어요. 포인터 역참조처럼 가리키는 메모리에 접근하는 연산만 여전히 unsafe 컨텍스트를 요구해요. 같은 미리 보기에서는 필드 초기화자나 catch 필터처럼 unsafe 블록을 둘 수 없는 자리에 단일 식에 대해 컨텍스트를 만드는 unsafe(expression) 형식도 추가됐어요. 자세한 내용은 안전하지 않은 식을 참고하세요. 미리 보기에서는 멤버의 unsafe 수정자에 새로운 의미도 부여해요. 멤버가 requires-unsafe임을 표시하는 거죠. 새 구문과 포인터 완화를 쓰려면 LangVersionpreview로 설정하세요. requires-unsafe 호출자 의무까지 강제하려면 updated-memory-safety-rules 컴파일러 기능을 켜야 해요. 활성화 방법은 업데이트된 메모리 안전성 규칙 사용 문서에서 볼 수 있어요.

예제

:::code language="csharp" source="./snippets/csrefKeywordsModifiers.cs" id="22":::

C# 언어 사양

자세한 내용은 C# 언어 사양안전하지 않은 코드 문서를 참고하세요. 언어 사양은 C# 구문과 사용법의 결정적(deterministic) 출처예요.

더 알아보기