Это то же самое, что и преобразование? - PullRequest
41 голосов
/ 27 сентября 2008

В книге Джесси Либерти по обучению C # он говорит: «Объекты одного типа можно преобразовать в объекты другого типа. Это называется приведением».

Если вы исследуете IL, сгенерированный из приведенного ниже кода, вы можете ясно увидеть, что приведенное назначение не делает то же самое, что преобразованное назначение. В первом случае вы можете видеть, что происходит упаковка / распаковка; в последнем вы можете увидеть вызов метода convert.

Я знаю, в конце концов, это может быть просто глупое семантическое различие - но бросает просто другое слово для преобразования. Я не хочу быть скупым, но мне не интересно чьи-то интуитивные чувства по этому поводу - мнения здесь не учитываются! Кто-нибудь может указать на конкретную ссылку, которая подтверждает или отрицает, если приведение и преобразование - это одно и то же?

    object x;
    int y;

    x = 4;

    y = ( int )x;

    y = Convert.ToInt32( x );

Спасибо

гр

Примечание добавлено после комментария Мэтта о явном / неявном:

Я не думаю, что неявное / явное - это разница. В коде, который я разместил, изменение явно в обоих случаях. Неявное преобразование - это то, что происходит, когда вы присваиваете короткое значение для int.

Примечание для Скливвз:

Я хотел получить подтверждение того, что мое подозрение в отношении раскованности языка Джесси Либерти (в остальном обычно ясного и ясного) было правильным. Я думал, что Джесси Либерти немного ослабляет свой язык. Я понимаю, что приведение маршрутизируется в иерархии объектов - то есть вы не можете преобразовать целое число в строку, но вы можете преобразовать пользовательское исключение, полученное из System.Exception, в System.Exception.

Интересно, однако, что когда вы пытаетесь преобразовать int в строку, компилятор говорит вам, что он не может «преобразовать» значение. Может быть, Джесси вернее, чем я думал!

Ответы [ 12 ]

0 голосов
/ 27 сентября 2008

Приведение говорит компилятору / интерпретатору, что объект на самом деле относится к этому типу (или имеет базовый тип / интерфейс этого типа). Это довольно быстрая вещь по сравнению с конвертированием, когда работа выполняется не компилятором / интерпретатором, а функцией, выполняющей анализ строки и выполняющей математические вычисления для преобразования в число.

0 голосов
/ 27 сентября 2008

Разница в том, является ли преобразование неявным или явным. Первый - приведение, второй - более явный вызов функции, которая преобразует. Вероятно, они делают одно и то же по-разному.

...