Unsafe 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
包含管理 Managed 和 Unmanaged 指標的泛型低階功能。
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 規格附加元件。
此類型上的大部分 API 都不會執行任何引數檢查或驗證。 使用這些 API 不正確可能會損毀進程記憶體或造成 .NET 執行時間不穩定。
這個類型通常是由想要撰寫高效能程式碼且願意隱藏 的低階程式庫作者使用。NET 的典型型別安全性檢查,以符合其效能目標。
請考慮下列範例,其會反轉 內的 Span<T>
專案。
注意
這些範例只是為了示範而存在。 在真實世界應用程式中,開發人員應該改用類似 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 漏洞、產生不正確的程式碼產生,或引發 .NET 執行時間內未定義和不穩定的行為。
方法
Add<T>(T, Int32) |
將位移新增至指定的 Managed 指標。 |
Add<T>(T, IntPtr) |
將專案位移新增至指定的 Managed 指標。 |
Add<T>(T, UIntPtr) |
將專案位移新增至指定的 Managed 指標。 |
Add<T>(Void*, Int32) |
將專案位移新增至指定的 Unmanaged 指標。 |
AddByteOffset<T>(T, IntPtr) |
將位元組位移新增至指定的 Managed 指標。 |
AddByteOffset<T>(T, UIntPtr) |
將位元組位移新增至指定的 Managed 指標。 |
AreSame<T>(T, T) |
判斷指定的 Managed 指標是否指向相同的位置。 |
As<T>(Object) |
將指定的物件轉換為指定類型。 |
As<TFrom,TTo>(TFrom) |
將指定的 Managed 指標重新解譯為 型 |
AsPointer<T>(T) |
將 Managed 指標轉換成 Unmanaged 指標。 |
AsRef<T>(T) |
將指定的唯讀參考重新解譯為可變動的參考。 |
AsRef<T>(Void*) |
將 Unmanaged 指標轉換成型 |
BitCast<TFrom,TTo>(TFrom) |
將型 |
ByteOffset<T>(T, T) |
從指定的 Managed 指標判斷從原點到目標的位元組位移。 |
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) |
傳回值,這個值表示指定的 Managed 指標是否大於另一個指定的 Managed 指標。 |
IsAddressLessThan<T>(T, T) |
傳回值,指出指定的 Managed 指標是否小於另一個指定的 Managed 指標。 |
IsNullRef<T>(T) |
判斷型 |
NullRef<T>() |
傳回型 |
Read<T>(Void*) |
從指定位置讀取類型 |
ReadUnaligned<T>(Byte) |
從指定的位址讀取類型的 |
ReadUnaligned<T>(Void*) |
從指定位置讀取類型的 |
SizeOf<T>() |
傳回指定型別參數值的大小。 |
SkipInit<T>(T) |
略過指定參考的明確指派規則。 |
Subtract<T>(T, Int32) |
從指定的 Managed 指標減去位移。 |
Subtract<T>(T, IntPtr) |
從指定的 Managed 指標減去專案位移。 |
Subtract<T>(T, UIntPtr) |
從指定的 Managed 指標減去專案位移。 |
Subtract<T>(Void*, Int32) |
從指定的 Unmanaged 指標減去專案位移。 |
SubtractByteOffset<T>(T, IntPtr) |
從指定的 Managed 指標減去位元組位移。 |
SubtractByteOffset<T>(T, UIntPtr) |
從指定的 Managed 指標減去位元組位移。 |
Unbox<T>(Object) |
傳回 |
Write<T>(Void*, T) |
將類型 |
WriteUnaligned<T>(Byte, T) |
將 類型的 |
WriteUnaligned<T>(Void*, T) |
將 類型的 |