업 캐스팅이나 다운 캐스트를 할 때 실제로 장면 뒤에서 어떤 일이 발생합니까? 마지막 줄의 캐스팅으로 유일한 목적은 우리가 잘못된 작업을 수행하지 않는 안전 컴파일러에게 것실제로 CLR 레벨에서 주물이 어떻게 작동합니까?
string myString = "abc";
object myObject = myString;
string myStringBack = (string)myObject;
: 나는 같은 일을 할 때하는 생각을했다. 따라서 실제로 코드에 캐스팅 코드가 포함되지 않는다는 생각이 들었습니다. 내가 틀렸어 보인다 :
.maxstack 1
.locals init (
[0] string myString,
[1] object myObject,
[2] string myStringBack)
L_0000: nop
L_0001: ldstr "abc"
L_0006: stloc.0
L_0007: ldloc.0
L_0008: stloc.1
L_0009: ldloc.1
L_000a: castclass string
L_000f: stloc.2
L_0010: ret
왜 CLR은 castclass string
과 같은 것이 필요합니까?
풀이 죽은 두 가지 가능한 구현이 있습니다
- 당신은
castclass something
을 필요가.castclass
을 수행하는 코드 줄에 도달하면 CLR은 형 변환을 시도합니다. 그렇다면 캐스트 클래스 문자열을 생략하고 코드를 실행하려고하면 어떻게 될까요? castclass
은 필요하지 않습니다. 모든 참조 유형은 비슷한 내부 구조를 가지므로 Form 인스턴스에서 문자열을 사용하려고하면 양식이 문자열이나 그 부속 유형이 아니므로 잘못된 사용 예외가 발생합니다.
또한 C# 4.0의 다음 statamente는 간단히 요약 할 수 있습니까?
Upcasting and downcasting between compatible reference types performs reference
conversions: a new reference is created that points to the same object.
정말 새로운 참조를 만드나요? 나는 그것이 다른 변수 유형에만 저장되는 동일한 참조 일 것이라고 생각했다.
감사
에릭, 아마도 직각으로 질문. 그러나 CastClass는 GetType() 런타임 유형 유추와 어떻게 비교됩니까? 둘 다 System.Reflection에 속하는 것 같습니다. 런타임 형식 호환성 (Equals 재정의 등)을 확인해야하는 경우에이를 캐스팅하거나 GetType == other.GetType()을 수행하는 것이 더 빠를 것이기 때문에 묻습니다. – Kakira
@Kakira : 이것은 질의 응답 사이트입니다. 나는 당신이 당신의 질문을 논평이 아닌 질문으로 게시하는 것을 권장합니다! 그러나 당신의 질문이 "이 두 가지가 더 빠를 것"이라는 형태의 질문이라면 그런 다음 질문을 게시하지 마십시오. 두 가지 방법으로 코드를 작성하고 두 가지 방법으로 실행하면 어떤 것이 더 빠르는지 알 수 있습니다. –
사과와 나는 당신의 요점을 본다. 나는 그것을 시험 할 것이다. CLR의 내부 동작에만 관심이 있었지만이 모든 것을 내 한 곳에서 찾을 수는 없습니다. :) – Kakira