다음을 통해 공유


Unsafe.As 메서드

정의

오버로드

As<T>(Object)

지정된 개체를 지정된 형식으로 캐스팅합니다.

As<TFrom,TTo>(TFrom)

지정된 관리형 포인터를 형식의 값에 대한 새 관리형 포인터로 다시 해석합니다 TTo.

As<T>(Object)

Source:
Unsafe.cs
Source:
Unsafe.cs
Source:
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 는 throw되지 않습니다.

의 동작 Unsafe.As<T>(o) 은 일반적인 "안전한" 캐스팅 작업이 (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)

Source:
Unsafe.cs
Source:
Unsafe.cs
Source:
Unsafe.cs

지정된 관리형 포인터를 형식의 값에 대한 새 관리형 포인터로 다시 해석합니다 TTo.

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

재해석할 관리형 포인터의 형식입니다.

TTo

관리되는 포인터의 원하는 형식입니다.

매개 변수

source
TFrom

재해석할 관리되는 포인터입니다.

반환

TTo

형식의 값에 대한 관리되는 포인터입니다 TTo.

설명

이 API는 개념적으로 C++의 reinterpret_cast<>과 유사합니다. 캐스팅이 합법적인지 확인하는 것은 발신자의 책임입니다. 런타임 검사 수행되지 않습니다.

관리되는 포인터만 재해석됩니다. 참조된 값 자체는 변경되지 않은 상태로 유지됩니다. 아래 예제를 고려해 보세요.

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}");

이 프로그램의 출력은 현재 컴퓨터의 엔디언성에 따라 달라집니다. big-endian 아키텍처에서 이 코드는 를 출력합니다 0x1234. little-endian 아키텍처에서 이 코드는 를 출력합니다 0x5678.

더 좁은 형식에서 더 넓은 형식으로 관리되는 포인터를 캐스팅할 때 호출자는 포인터를 역참조하면 범위를 벗어난 액세스가 발생하지 않도록 해야 합니다. 호출자는 결과 포인터가 참조된 형식에 맞게 올바르게 정렬되었는지도 확인합니다. 맞춤 가정에 대한 자세한 내용은 ECMA-335, Sec. I.12.6.2("맞춤")를 참조하세요.

적용 대상