상황별 키워드는 safe업데이트된 메모리 안전 모델 에서 안전 선택을 명시적으로 지정해야 하는 위치에서 선언이 건전하다는 것을 확인합니다. 명시적 또는 확장된 레이아웃이 있는 형식의 멤버 또는 필드와 같이 extern 컴파일러가 자체적으로 분류할 수 없는 선언에 한정자로 적용 safe 합니다.
safe 한정자는 호출자에게 보안을 감사할 unsafesafe 의무를 전파하면서 unsafe 호출자에게 컨텍스트가 필요하지 않음 unsafe 을 확인합니다.
Important
키 safe 워드는 업데이트된 메모리 안전 모델의 일부이며 C# 15 및 .NET 11의 미리 보기 기능입니다.
preview 구문을 사용하도록 설정합니다LangVersion. 명시적 safe 또는 unsafe 선택 사항 및 안전하지 않은 호출자 의무를 포함하여 업데이트된 규칙을 적용하려면 컴파일러 기능을 사용하도록 설정합니다 updated-memory-safety-rules . 활성화 세부 정보는 업데이트된 메모리 안전 규칙 사용을 참조하세요. 전체 디자인은 메모리 안전 기능 사양을 참조하세요.
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 마찬가지로 업데이트된 규칙을 사용할 때 두 한정자를 모두 생략하는 것은 오류입니다.
C# 언어 사양
자세한 내용은 C# 언어 사양의 안전하지 않은 코드를 참조하세요. 언어 사양은 C# 구문 및 사용법에 대 한 신뢰할 수 있는 소스 됩니다.
업데이트된 메모리 안전 모델의 디자인은 메모리 안전 기능 사양을 참조하세요.
또한, 다음을 참조하세요.
.NET