Unsafe.As 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
오버로드
As<T>(Object) |
지정된 개체를 지정된 형식으로 캐스팅합니다. |
As<TFrom,TTo>(TFrom) |
지정된 관리형 포인터를 형식의 값에 대한 새 관리형 포인터로 다시 해석합니다 |
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
캐스트할 개체입니다.
반환
지정된 형식으로 캐스팅된 원래 개체입니다.
설명
이 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
.
설명
이 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("맞춤")를 참조하세요.
적용 대상
.NET