safe(C# 참조)

컨텍스트 키워드는 safe업데이트된 메모리 안전 모델에서 사용 사이트에서 컨텍스트가 필요하지 unsafe 않은 것으로 선언을 표시합니다. 한 safe 정자는 .에 해당합니다 unsafe. 선언의 호출자에게 안전하지 않은 컨텍스트는 필요하지 않지만 호출 unsafe 자에게 safe 안전 감사 의무를 전파합니다.

호출자에게 컨텍스트가 safeAllowUnsafeBlocks 필요하지 않더라도 키워드 자체를 사용하려면 컴파일러 옵션(-unsafe)이 unsafe 필요합니다. 일반 선언은 기본적으로 안전하므로 안전하지 않은 컴파일이 불필요하게 필요하지 않은 경우를 생략 safe 합니다.

Important

키 safe 워드는 업데이트된 메모리 안전 모델의 일부이며 C# 15 및 .NET 11의 미리 보기 기능입니다. preview 구문을 사용하도록 설정합니다LangVersion. 명시적 safe 또는 unsafe 선택 사항 및 안전하지 않은 호출자 의무를 포함하여 업데이트된 규칙을 적용하려면 컴파일러 기능을 사용하도록 설정합니다 updated-memory-safety-rules . 활성화 세부 정보는 업데이트된 메모리 안전 규칙 사용을 참조하세요. 전체 디자인은 메모리 안전 기능 사양을 참조하세요.

허용된 선언 및 필수 선언

메서드, 생성자, 속성 및 필드를 포함하여 안전하지 않은 필수 한정자를 허용하는 선언에 적용 safe 할 수 있습니다. 일반 선언의 경우 한정자는 소스 생성 코드를 포함하여 의도한 계약을 명시적으로 만들 수 있습니다. 멤버 및 레이아웃 필드로 extern 제한되지 않습니다.

특정 선언에는 업데이트된 규칙을 사용하도록 설정하거나 unsafe 명시적으로 선택 safe 해야 합니다. 다음 섹션에서는 멤버 및 명시적 또는 확장된 레이아웃 필드에 대해 설명 extern 합니다.

와 달리 unsafesafe 어휘 컨텍스트를 설정하지 않습니다. 멤버 본문에서 안전하지 않은 작업을 안전하게 수행하거나 묶은 안전하지 않은 컨텍스트를 취소하지는 않습니다. 동일한 선언에서 safe 한 unsafe 정자와 결합할 수 없습니다. 이렇게 하면 CS9388이 생성됩니다.

최신 컴파일러 safe 에서는 호출자에게 안전하지 않은 컨텍스트가 필요하지 않더라도 선언도 필요합니다 AllowUnsafeBlocks. 프로젝트 파일에서 CS9401을 확인하도록 설정합니다<AllowUnsafeBlocks>true</AllowUnsafeBlocks>. 이 한정자 검사는 업데이트된 규칙 적용 옵트인과 독립적입니다. Roslyn은 .NET 11.0.100 이후 Visual Studio 2026 버전 18.13에 도입된 대로 문서화합니다. .NET 11.0.100 컴파일러는 이 요구 사항을 safe적용하지 않습니다. 컴파일러 경계 및 안전하지 않은 블록에서 CS0227 과 구별되는 경우 안전하지 않은 컨텍스트 요구 사항을 참조하세요.

Extern 멤버

멤버는 네이 extern 티브 코드를 호출하므로 컴파일러는 해당 보안을 분류할 수 없습니다. 업데이트된 모델에서 부분 메서드를 비롯한 모든 extern 선언을 LibraryImport 표시합니다safe.unsafe

// Syntax requires LangVersion preview; enforcement requires the updated-memory-safety-rules compiler feature.
[LibraryImport("libc")]
internal static safe partial int getpid();

[LibraryImport("libc", StringMarshalling = StringMarshalling.Utf8)]
internal static unsafe partial nint strlen(byte* str);

getpid 는 매개 변수를 사용하지 않고 기본 형식을 반환하므로 작성자는 호출이 안전하다는 것을 증명하고 호출자는 컨텍스트 없이 unsafe 사용합니다. strlen 는 네이티브 코드가 역참조하는 원시 포인터를 사용하므로 선언이 unsafe 호출자에게 의무를 전파합니다. 업데이트된 규칙을 사용하도록 설정하면 두 한정자를 모두 생략하면 오류가 발생합니다.

명시적 또는 확장된 레이아웃 필드

[StructLayout(LayoutKind.Explicit)] 형식에서 [ExtendedLayout]컴파일러는 모든 인스턴스 필드의 안전성을 자체적으로 분류할 수 없습니다. 이러한 모든 필드를 표시하거나 다음을 safe 수행합니다 unsafe.

// Syntax requires LangVersion preview; enforcement requires the updated-memory-safety-rules compiler feature.
[StructLayout(LayoutKind.Explicit)]
internal struct Union
{
    [FieldOffset(0)]
    internal safe int AsInt;

    [FieldOffset(0)]
    internal safe float AsFloat;
}

네이티브 포인터를 보유하거나 형식 시스템에서 표현할 수 없는 고정을 전달하는 형식이 있는 필드는 다음과 같습니다 unsafe. 형식 시스템에서 형식을 완전히 설명하는 필드입니다 safe. 명시적 레이아웃 필드 및 확장 레이아웃 필드에도 동일한 규칙이 적용됩니다. 멤버와 extern 마찬가지로 업데이트된 규칙을 사용할 때 두 한정자를 모두 생략하는 것은 오류입니다.

0 StructLayoutAttribute.Pack 이 아닌 형식의 인스턴스 필드에 동일한 한정자를 적용하거나 StructLayoutAttribute.Size순차 및 자동 레이아웃을 포함합니다. 예를 들어 순차 레이아웃 형식에는 Pack = 1 동일한 명시적 선택이 필요합니다. 지정되지 않았거나 0 값은 자체적으로 추가 규칙을 트리거하지 않습니다. 정적 및 상수 필드는 제외됩니다. 합성된 백업 필드의 경우 소유 속성 또는 이벤트에 한정자를 배치합니다.

다른 합성된 스토리지에 대한 CS9392 메시지 및 수정 사항은 필드 레이아웃 안전성을 참조하세요.

C# 언어 사양

자세한 내용은 C# 언어 사양의 안전하지 않은 코드를 참조하세요. 언어 사양은 C# 구문 및 사용법에 대 한 신뢰할 수 있는 소스 됩니다.

업데이트된 메모리 안전 모델의 디자인은 메모리 안전 기능 사양을 참조하세요.

또한, 다음을 참조하세요.