Когда вы делаете upcast или downcast, что действительно происходит за кулисами? У меня была мысль, что когда что-то делать, как:Как действительно кастинги работают на уровне 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 и попытался запустить код? - Вам не требуется
castclass
. Поскольку все ссылочные типы имеют схожую внутреннюю структуру, если вы пытаетесь использовать строку в экземпляре формы, она будет исключать неправильное использование (поскольку она определяет, что форма не является строкой или каким-либо ее подтипом).
Кроме того, является ли следующий statamente из C# 4.0 в двух словах правильным?
Upcasting and downcasting between compatible reference types performs reference
conversions: a new reference is created that points to the same object.
Действительно ли это создает новую ссылку? Я думал, что это будет одна и та же ссылка, только в другом типе переменной.
Thanks
Эрик, вероятно, ортогональный вопрос. Но как CastClass сравнивается с методом вывода типа GetType()? Оба, похоже, принадлежат к System.Reflection. Я спрашиваю, потому что в тех случаях, когда мне нужно проверить совместимость типа времени выполнения (например, переопределить Equals), было бы быстрее выполнить его или сделать GetType == other.GetType()? – Kakira
@Kakira: Это сайт вопросов и ответов. Я рекомендую вам разместить свой вопрос как вопрос, а не как комментарий! Однако, если ваш вопрос имеет форму «какая из этих двух вещей быстрее?» то не беспокойтесь, чтобы задать вопрос. Напишите код в обоих направлениях, запустите его в обоих направлениях, а затем вы узнаете, что быстрее. –
Приношу свои извинения, и я вижу вашу точку зрения. Я проверю это. Просто интересовался внутренней работой CLR, но, похоже, не смог найти все это в одном месте :). – Kakira