Unsafe クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
マネージド ポインターとアンマネージド ポインターを操作するためのジェネリックで低レベルの機能が含まれています。
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) |
指定されたマネージド ポインターを、 |
| AsPointer<T>(T) |
マネージド ポインターをアンマネージ ポインターに変換します。 |
| AsRef<T>(T) |
指定された読み取り専用参照を変更可能な参照として再解釈します。 |
| AsRef<T>(Void*) |
アンマネージ ポインターをマネージド ポインターに |
| BitCast<TFrom,TTo>(TFrom) |
|
| ByteOffset<T>(T, T) |
指定されたマネージド ポインターから配信元からターゲットへのバイト オフセットを決定します。 |
| Copy<T>(T, Void*) |
指定した場所に |
| Copy<T>(Void*, 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) |
|
| IsAddressLessThan<T>(T, T) |
指定したマネージド ポインターが、指定した別のマネージド ポインターより小さいかどうかを示す値を返します。 |
| IsAddressLessThanOrEqualTo<T>(T, T) |
|
| IsNullRef<T>(T) |
|
| NullRef<T>() |
|
| Read<T>(Void*) |
指定した場所から |
| ReadUnaligned<T>(Byte) |
ソース アドレスのアーキテクチャに依存するアラインメントを想定せずに、指定されたアドレスから |
| ReadUnaligned<T>(Void*) |
ソース アドレスのアーキテクチャに依存する配置を想定せずに、特定の場所から |
| 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) |
ボックス化された値に |
| Write<T>(Void*, T) |
指定した場所に |
| WriteUnaligned<T>(Byte, T) |
宛先アドレスのアーキテクチャに依存するアラインメントを想定せずに、 |
| WriteUnaligned<T>(Void*, T) |
宛先アドレスのアーキテクチャに依存するアラインメントを想定せずに、 |