Unsafe クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
マネージド ポインターとアンマネージド ポインターを操作するための汎用的で低レベルの機能が含まれています。
public ref class Unsafe abstract sealed
public static class Unsafe
type Unsafe = class
Public Class Unsafe
- 継承
-
Unsafe
注釈
警告
この型は、高度なポインター操作シナリオを対象としています。 呼び出し元は、 ECMA-335、Sec. II.14.4、III.1.1.5、 および ECMA-335 CLI Specification Addendum に精通していることを前提としています。
この型のほとんどの 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 の通常の安全性チェック。 このような開発者は、通常、正確性の強制に役立つ静的分析ツールまたは独自のコード レビューに依存します。 API を使用すると、次の例に示すように、開発者は Unsafe
検証不可能なコンストラクトを使用してこのコードを書き換えます。
// 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) |
指定したマネージド ポインターが、指定した別のマネージド ポインターより大きいかどうかを示す値を返します。 |
IsAddressLessThan<T>(T, T) |
指定したマネージド ポインターが、指定した別のマネージド ポインターより小さいかどうかを示す値を返します。 |
IsNullRef<T>(T) |
型 |
NullRef<T>() |
型の値への null マネージド ポインターを返します |
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) |
宛先アドレスのアーキテクチャに依存する配置を想定せずに、指定された場所に型 |
適用対象
.NET