Подтвердить что ты не робот

Зачем использовать Convert.ToInt32 для кастинга?

Сегодня появился вопрос о том, как преобразовать объект в его конкретный тип (int), я сказал, чтобы он его произвел:

int i = (int)object;

коллега сказал использовать Convert.ToInt32().

int i = Convert.ToInt32(object)

Какая разница между Convert.ToInt32() и прямыми объектами?

4b9b3361

Ответ 1

Не каждый объект может быть перенесен непосредственно на int. Например, следующее не будет компилироваться:

string s = "1";
int i = (int)s;

потому что string неявно конвертируется в int.

Однако это законно:

string s = "1";
int i = Convert.ToInt32(s);

Как побочная заметка, как кастинг, так и Convert могут генерировать исключения, если исходный объект не может быть преобразован. Однако int.TryParse не бросает, если он терпит неудачу; скорее, он возвращает false (но он принимает только строку, поэтому перед использованием этого объекта необходимо .ToString()):

object s = "1";
int i;
if(int.TryParse(s.ToString(), out i))
{
   // i now has a value of 1
}

Ответ 2

Они принципиально разные

Кастинг говорит, что объект является экземпляром того типа, на который он был брошен, поэтому бросьте его.

Convert говорит, что происходит преобразование между преобразуемыми типами.

Так, например, вы не можете передать строку в int, но можете ее преобразовать. Существует некоторая серая область/перекрытие из-за определенных встроенных правил приведения для примитивных типов или явных преобразований преобразования, которые вы можете добавить к своим собственным типам. Но в целом я бы не думал об этих двух как эквивалент.

Учитывая, что нет "лучшего" варианта, вы должны использовать опцию, которая имеет смысл в данном контексте.

Ответ 3

Вы можете использовать только то, когда исходный тип имеет литье, определенное для нового типа. Так что литье из одного числового типа в другой (например, long to int) обычно возможно, но отличное от нецифровых типов до числовых типов (например, строка в int) обычно невозможно. Convert предоставляет гораздо больше методов для изменения этих нечисловых типов на числовые, поэтому причина его использования заключается в том, что вы с меньшей вероятностью получите ошибку.

Ответ 4

Я обычно предпочитаю Convert сам, потому что он обеспечивает хороший унифицированный интерфейс для преобразования. Например, Convert.ToInt32("45") работает, но (int)"45", нет.

Convert также сообщит о таких проблемах, как бросание OverflowException. Кастинг может быть опасным, поскольку отбрасывание от слова long до int может привести к плохим результатам, и время выполнения не скажет вам.

Мне также нравится, что Convert.ToX(object obj) существует, что позволяет просто отключать вещи до Convert и по большей части забывать об этом.

Ответ 5

Convert.ToInt32 в основном такой же, как int.Parse С одним отличием: если вы используете int.Parse(null), генерируется исключение, а Convert.ToInt32 возвращает 0

Кастинг, с другой стороны, является более сложной операцией и будет работать только в том случае, если значение действительно представляет собой тип значения в квадрате или anohter (в штучной упаковке /unboxed ), который может быть неявно преобразован.

(бокс - это объектное представление типа значения)

Ответ 6

Convert - это класс, который содержит ряд статических методов и, как предполагается, используется для преобразования базовых типов, поддерживаемые типы Boolean, Char, SByte, Byte, Int16, Int32, Int64, UInt16, UInt32, UInt64, Single, Double, Decimal, DateTime и String. Оператор литья позволяет вам делать то же самое, но вы можете использовать его и для других типов, включая типы, которые вы создаете. Вы также можете определять эти операторы в своих классах, позволяя вам конвертировать из чего угодно. Таким образом, это разница, одна из них является методом, а другая - оператором. Я не проверял кишки оперона при преобразовании и int в строку, но он может иметь ту же логику, что и методы в Convert.

Ответ 7

Если вы знаете, что экземпляр в штучной упаковке - это int, вы можете безопасно использовать оператор рассылки (int) для его удаления. Однако, если он конвертируется в int (например, float), использование оператора трансляции будет терпеть неудачу во время выполнения.

Ознакомьтесь с документацией класса Convert для получения более подробной информации о конкретных конверсиях, которые она разрешает и запрещает.

Ответ 8

Разница Convert.ToInt32(object value) будет пытаться использовать IConvertible для преобразования значения в int, где, поскольку прямой прилив будет просто генерировать исключение, если такой приведение недействительно.

Другие перегрузки также пытаются конвертировать и не выполнять литье.