共用方式為


Unsafe.As 方法

定義

多載

As<T>(Object)

將指定的物件轉換為指定類型。

As<TFrom,TTo>(TFrom)

將指定的Managed指標重新解譯為 型 TTo別值的新Managed指標。

As<T>(Object)

來源:
Unsafe.cs
來源:
Unsafe.cs
來源:
Unsafe.cs

將指定的物件轉換為指定類型。

public:
generic <typename T>
 where T : class static T As(System::Object ^ o);
public static T? As<T> (object? o) where T : class;
public static T As<T> (object o) where T : class;
static member As : obj -> 'T (requires 'T : null)
Public Shared Function As(Of T As Class) (o As Object) As T

類型參數

T

對象要轉換成的型別。

參數

o
Object

要轉換的物件。

傳回

T

原始物件,轉換成指定的型別。

備註

此 API 可用來將物件轉換成指定的類型,並隱藏運行時間的一般類型安全檢查。 呼叫者必須負責確保轉換是合法的。 不會 InvalidCastException 擲回 。

只有在一般「安全」轉型作業(T)o成功時,才會妥善定義 的行為Unsafe.As<T>(o)。 使用此 API 來規避不受支持的轉換,而且可能會導致運行時間不穩定。

為了協助強制執行正確的使用方式,開發人員可能會考慮在其程序代碼中使用標準轉換或僅限偵錯判斷提示,如下列範例所示。

void ReinterpretCastAndUse_Sample1(object o)
{
  // Assume that we know through some other means that 'o' is a string,
  // and we want our library's debug builds to verify this.
  // One way to do this is through a standard-style cast.
  // A standard-style cast will throw InvalidCastException at runtime if the cast fails.
  // n.b. Casts of null objects to reference types will succeed.

#if DEBUG
  string s = (string)o;
#else
  string s = Unsafe.As<string>(o);
#endif

  DoSomethingWith(s);
}

void ReinterpretCastAndUse_Sample2(object o)
{
  // Another way to check this is through a debug-only assert.
  // Failed assertions will trigger attached debuggers or terminate the application immediately.
  // Calls to Debug.Assert are removed from release builds.

  Debug.Assert(o is null or string, "Unsafe.As call below is illegal!");
  string s = Unsafe.As<string>(o);

  DoSomethingWith(s);
}

適用於

As<TFrom,TTo>(TFrom)

來源:
Unsafe.cs
來源:
Unsafe.cs
來源:
Unsafe.cs

將指定的Managed指標重新解譯為 型 TTo別值的新Managed指標。

public:
generic <typename TFrom, typename TTo>
 static TTo % As(TFrom % source);
public static ref TTo As<TFrom,TTo> (ref TFrom source);
static member As : 'From -> 'o
Public Shared Function As(Of TFrom, TTo) (ByRef source As TFrom) As TTo

類型參數

TFrom

要重新解譯的Managed指標類型。

TTo

Managed 指標所需的類型。

參數

source
TFrom

要重新解譯的Managed指標。

傳回

TTo

TTo別值的Managed指標。

備註

此 API 在概念上類似於 C++ 的 reinterpret_cast<>。 呼叫者必須負責確保轉換是合法的。 不會執行運行時間檢查。

只會重新解譯 Managed 指標。 參考的值本身會保持不變。 請思考一下下列範例。

int[] intArray = new int[] { 0x1234_5678 }; // a 1-element array
ref int refToInt32 = ref intArray[0]; // managed pointer to first Int32 in array
ref short refToInt16 = ref Unsafe.As<int, short>(ref refToInt32); // reinterpret as managed pointer to Int16
Console.WriteLine($"0x{refToInt16:x4}");

此程序的輸出取決於目前電腦的結束性。 在大端架構上,此程式代碼會輸出 0x1234。 在小到小的架構上,此程式代碼會輸出 0x5678

將 Managed 指標從較窄的類型轉換成較寬的類型時,呼叫端必須確定取值指標不會產生超出界限的存取。 呼叫端也負責確保產生的指標已針對參考的類型正確對齊。 如需對齊假設的詳細資訊,請參閱 ECMA-335, Sec. I.12.6.2 (“Alignment”) 。

適用於