safe (C# リファレンス)

safeコンテキスト キーワードは、更新されたメモリ安全モデルで安全性の選択を明示的にする必要がある場所で宣言が正しいことを証明します。 safeを、明示的または拡張レイアウトの型のexternメンバーやフィールドなど、コンパイラが単独で分類できない宣言に修飾子として適用します。 safe修飾子は、unsafeに対応します。safe呼び出し元はunsafeコンテキストを必要とせず、unsafeは呼び出し元に安全性を監査する義務を伝達することを証明します。

Important

safe キーワードは、更新されたメモリ 安全モデルの一部であり、C# 15 および .NET 11 のプレビュー機能です。 LangVersionをpreviewに設定して構文を有効にします。 また、明示的な 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# の構文と使用法に関する信頼性のある情報源です。

更新されたメモリ安全モデルの設計については、 メモリ安全機能の仕様を参照してください。

こちらも参照ください