Unsafe クラス

定義

マネージド ポインターとアンマネージド ポインターを操作するためのジェネリックで低レベルの機能が含まれています。

public ref class Unsafe abstract sealed
public static class Unsafe
type Unsafe = class
Public Class Unsafe
継承
Unsafe

注釈

Warning

この型は、高度なポインター操作シナリオを対象としています。 呼び出し元は、 ECMA-335、Sec. II.14.4、III.1.1.5、 および ECMA-335 CLI 仕様補遺に精通していると見なされます。

この型のほとんどの API では、引数のチェックや検証は実行されません。 これらの API を誤って使用すると、プロセス メモリが破損したり、.NET ランタイムが不安定になる可能性があります。

この型は、通常、高パフォーマンス コードを記述する低レベルのライブラリ作成者によって使用され、パフォーマンス目標を達成するために.NETの一般的なタイプ セーフ チェックを抑制することを望んでいます。

次の例では、 Span<T>内の要素を反転します。

Note

これらの例は、デモンストレーションの目的で単純に存在します。 実際のアプリケーションでは、開発者は代わりに Reverse などのヘルパー関数を使用する必要があります。この関数は、これらの例よりも最適化されています。

// A safe, verifiable way to reverse a Span<T>.
static void Reverse<T>(Span<T> span)
{
 while (span.Length > 1)
 {
   T firstElement = span[0];
   T lastElement = span[^1];
   span[0] = lastElement;
   span[^1] = firstElement;
   span = span[1..^1];
 }
}

このメソッドは完全にタイプ セーフであり、.NET ランタイムは安全を強制するために境界チェックを挿入する場合があります。 ただし、低レベルのライブラリ作成者は、独自のコードのパフォーマンスを向上させるために、.NETの通常の安全性チェックを抑制したい場合があります。 このような開発者は、通常、正確性の強制に役立つ静的分析ツールまたは独自のコード レビューに依存します。 Unsafe API を使用すると、次の例に示すように、開発者は検証不可能なコンストラクトを使用してこのコードを書き換えることができるようになります。

// A correct but unverifiable way to reverse a Span<T>.
static void Reverse<T>(Span<T> span)
{
 if (span.Length > 1)
 {
   ref T refLeft = ref MemoryMarshal.GetReference(span);
   ref T refRight = ref Unsafe.Add(ref refLeft, span.Length - 1);
   do
   {
     T leftElement = refLeft;
     T rightElement = refRight;
     refLeft = rightElement;
     refRight = leftElement;
     refLeft = ref Unsafe.Add(ref refLeft, 1);
     refRight = ref Unsafe.Subtract(ref refRight, 1);
   } while (Unsafe.IsAddressLessThan(ref refLeft, ref refRight));
 }
}

Unsafe API は一般的なタイプ セーフ検証を抑制するため、記述しているコードが有効であることを確認するのは呼び出し元の責任です。 これらの API を誤用すると、アクセス違反が発生したり、GC ホールが作成されたり、誤った codegen が生成されたり、.NETランタイム内で未定義の不安定な動作が発生したりする可能性があります。

メソッド

名前 説明
Add<T>(T, Int32)

指定されたマネージド ポインターにオフセットを追加します。

Add<T>(T, IntPtr)

指定されたマネージド ポインターに要素オフセットを追加します。

Add<T>(T, UIntPtr)

指定されたマネージド ポインターに要素オフセットを追加します。

Add<T>(Void*, Int32)

指定されたアンマネージ ポインターに要素オフセットを追加します。

AddByteOffset<T>(T, IntPtr)

指定されたマネージド ポインターにバイト オフセットを追加します。

AddByteOffset<T>(T, UIntPtr)

指定されたマネージド ポインターにバイト オフセットを追加します。

AreSame<T>(T, T)

指定したマネージド ポインターが同じ場所を指しているかどうかを判断します。

As<T>(Object)

指定したオブジェクトを指定した型にキャストします。

As<TFrom,TTo>(TFrom)

指定されたマネージド ポインターを、 TTo型の値への新しいマネージド ポインターとして再解釈します。

AsPointer<T>(T)

マネージド ポインターをアンマネージ ポインターに変換します。

AsRef<T>(T)

指定された読み取り専用参照を変更可能な参照として再解釈します。

AsRef<T>(Void*)

アンマネージ ポインターをマネージド ポインターに T型の値に変換します。

BitCast<TFrom,TTo>(TFrom)

TFrom型の指定された値をTTo型の値として再解釈します。

ByteOffset<T>(T, T)

指定されたマネージド ポインターから配信元からターゲットへのバイト オフセットを決定します。

Copy<T>(T, Void*)

指定した場所に T 型の値をコピーします。

Copy<T>(Void*, T)

指定した場所に T 型の値をコピーします。

CopyBlock(Byte, Byte, UInt32)

ソース アドレスから宛先アドレスにバイトをコピーします。

CopyBlock(Void*, Void*, UInt32)

ソース アドレスから宛先アドレスにバイトをコピーします。

CopyBlockUnaligned(Byte, Byte, UInt32)

アーキテクチャに依存するアドレスの配置を想定せずに、ソース アドレスから宛先アドレスにバイトをコピーします。

CopyBlockUnaligned(Void*, Void*, UInt32)

アーキテクチャに依存するアドレスの配置を想定せずに、ソース アドレスから宛先アドレスにバイトをコピーします。

InitBlock(Byte, Byte, UInt32)

指定した初期値を使用して、特定の場所にあるメモリ ブロックを初期化します。

InitBlock(Void*, Byte, UInt32)

指定した初期値を使用して、特定の場所にあるメモリ ブロックを初期化します。

InitBlockUnaligned(Byte, Byte, UInt32)

アーキテクチャに依存するアドレスのアラインメントを想定せずに、指定された初期値を使用して、特定の場所でメモリ ブロックを初期化します。

InitBlockUnaligned(Void*, Byte, UInt32)

アーキテクチャに依存するアドレスのアラインメントを想定せずに、指定された初期値を使用して、特定の場所でメモリ ブロックを初期化します。

IsAddressGreaterThan<T>(T, T)

指定したマネージド ポインターが、指定した別のマネージド ポインターより大きいかどうかを示す値を返します。

IsAddressGreaterThanOrEqualTo<T>(T, T)

leftによって参照されるメモリ アドレスが、rightによって参照されるメモリ アドレス以上かどうかを判断します。

IsAddressLessThan<T>(T, T)

指定したマネージド ポインターが、指定した別のマネージド ポインターより小さいかどうかを示す値を返します。

IsAddressLessThanOrEqualTo<T>(T, T)

leftによって参照されるメモリ アドレスが、rightによって参照されるメモリ アドレス以下かどうかを判断します。

IsNullRef<T>(T)

T型の値への指定されたマネージド ポインターが null 参照であるかどうかを判断します。

NullRef<T>()

T型の値への null マネージド ポインターを返します。

Read<T>(Void*)

指定した場所から T 型の値を読み取ります。

ReadUnaligned<T>(Byte)

ソース アドレスのアーキテクチャに依存するアラインメントを想定せずに、指定されたアドレスから T 型の値を読み取ります。

ReadUnaligned<T>(Void*)

ソース アドレスのアーキテクチャに依存する配置を想定せずに、特定の場所から T 型の値を読み取ります。

SizeOf<T>()

指定された型パラメーターの値のサイズを返します。

SkipInit<T>(T)

特定の参照の明確な割り当て規則をバイパスします。

Subtract<T>(T, Int32)

指定されたマネージド ポインターからオフセットを減算します。

Subtract<T>(T, IntPtr)

指定されたマネージド ポインターから要素オフセットを減算します。

Subtract<T>(T, UIntPtr)

指定されたマネージド ポインターから要素オフセットを減算します。

Subtract<T>(Void*, Int32)

指定されたアンマネージ ポインターから要素オフセットを減算します。

SubtractByteOffset<T>(T, IntPtr)

指定されたマネージド ポインターからバイト オフセットを減算します。

SubtractByteOffset<T>(T, UIntPtr)

指定されたマネージド ポインターからバイト オフセットを減算します。

Unbox<T>(Object)

ボックス化された値に mutable ref を返します。

Write<T>(Void*, T)

指定した場所に T 型の値を書き込みます。

WriteUnaligned<T>(Byte, T)

宛先アドレスのアーキテクチャに依存するアラインメントを想定せずに、 T 型の値を特定の場所に書き込みます。

WriteUnaligned<T>(Void*, T)

宛先アドレスのアーキテクチャに依存するアラインメントを想定せずに、 T 型の値を特定の場所に書き込みます。

適用対象