unsafe 키워드
unsafe 키워드 (C# 참조)
포인터를 다루는 연산이라면 빠짐없이 필요한 게 하나 있어요. 바로 안전하지 않은 컨텍스트(unsafe context)죠. unsafe 키워드는 그 컨텍스트를 만들어 주는 역할을 해요. 자세한 내용은 안전하지 않은 코드와 포인터 문서에서 다뤄요. C#에 처음 도입된 시점부터 함께해 온 키워드니까, 버전 걱정 없이 그대로 쓸 수 있어요.
본문
타입이나 멤버를 선언할 때 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임을 표시하는 거죠. 새 구문과 포인터 완화를 쓰려면LangVersion을preview로 설정하세요. requires-unsafe 호출자 의무까지 강제하려면updated-memory-safety-rules컴파일러 기능을 켜야 해요. 활성화 방법은 업데이트된 메모리 안전성 규칙 사용 문서에서 볼 수 있어요.
예제
:::code language="csharp" source="./snippets/csrefKeywordsModifiers.cs" id="22":::
C# 언어 사양
자세한 내용은 C# 언어 사양의 안전하지 않은 코드 문서를 참고하세요. 언어 사양은 C# 구문과 사용법의 결정적(deterministic) 출처예요.