Когда использовать Cast или Convert

Мне любопытно узнать, какая разница между приложением, чтобы сказать int по сравнению с использованием Convert.toInt32(). Есть ли какое-то увеличение производительности при использовании одного?

Также для каждой ситуации должны использоваться. В настоящее время я более склонен использовать Convert, но у меня нет причин идти в любом случае. В моем сознании я вижу, что они оба достигают одной и той же цели.

Ответ 1

Смотрите Diff Between Cast and Convert на другом форуме

Ответ

Convert.ToInt32(String, IFormatProvider) под вызовами Int32.Parse (чтение замечаний).
Поэтому единственное отличие состоит в том, что если пустая строка передается, она возвращает 0, тогда как Int32.Parse выбрасывает ArgumentNullException.
Это действительно вопрос выбора, который вы используете.

Лично я не использую ни один из них и имею тенденцию использовать функции TryParse (например, System.Int32.TryParse()).


UPDATE

Ссылка сверху не работает, см. этот ответ в StackOverflow.

Ответ 2

Отправлять, когда он действительно является типом int, конвертировать, когда он не является int, но вы хотите, чтобы он стал одним.

Например, int i = (int)o;, когда вы знаете o, является int

int i = Convert.ToInt32("123") потому что "123" не является int, это строковое представление int.

Ответ 3

Есть еще одна разница. "Конвертировать" всегда проверяется переполнением, в то время как "приведение" возможно, в зависимости от ваших настроек и используемого ключевого слова "checked" или "unchecked".

Чтобы быть более явным. Рассмотрим код:

int source = 260;
byte destination = (byte)source;

Тогда пункт назначения будет 4 без предупреждения.

Но:

int source = 260;
byte destination = Convert.ToByte(source);

предоставит вам исключение.

Ответ 4

Не все типы поддерживают преобразование, например

int i = 0;
decimal d = (decimal)i;

потому что необходимо реализовать явный оператор. Но .NET также обеспечивает IConvertible interface, поэтому любой тип реализует этот интерфейс, который может быть преобразован в большинство встроенных типов фреймов. И, наконец, класс Convert помогает работать с типами реализует интерфейс IConvertible.

Ответ 5

Приведение просто говорит компилятору, что этот объект на самом деле является реализацией другого типа и теперь рассматривается как новая реализация. В то время как конвертер говорит, что это не наследует от того, что вы пытаетесь преобразовать, но есть способ, которым это нужно. Например, скажем, мы превращаем "16" в int. "16" - это строка и не наследует от int каким-либо образом. Но, очевидно, что "16" можно было бы превратить в int 16.

Ответ 6

Существует много перегрузок для Convert.ToInt32, которые могут принимать, например, строку. При попытке передать строку в int вызовет ошибку компиляции. Суть в том, что они предназначены для разных целей. Преобразование особенно полезно, когда вы не уверены, какой тип объекта вы используете.

Ответ 7

Бросив мой 2c - кажется, что концептуальное различие может быть полезным. Не то, чтобы я эксперт..:

Литье меняет тип репрезентации. Таким образом, "32" и 32L и 32.0f кажутся разумными между собой. С# не будет поддерживать "32" автоматически, но большинство динамических языков будут. Поэтому я буду использовать (длинный) 32 "или (String) 32L. Когда я смогу. У меня также есть другое правило:" Кастинг должен быть круглым".

Преобразование не обязательно должно быть round tripable и может просто создать абсолютно новый объект.

Зона Gray - это, например, строка "32xx". Можно сделать вывод, что при его нажатии он становится 32L (число анализировалось до тех пор, пока оно не могло быть). Perl использовал это. Но тогда это нарушает мое требование туда и обратно. То же самое происходит с 32,5f до 32L. Почти все языки, включая очень статически типизированные, допускают это, и это тоже не соответствует правилу round trippable. Он серый, если вы разрешаете "32" , а затем во время компиляции вы не знаете, может ли это быть "32xxx".

Другое отличие, которое можно сделать, - просто использовать кастинг для "IsA", а не "makeLookLikeA". Поэтому, если вы знаете, что строка поступает из базы данных, но на самом деле является int в неофициальной схеме, не стесняйтесь использовать листинг (хотя в этом случае С# хочет использовать Convert в любом случае). То же самое касается плавающего. Но не для тех случаев, когда вы просто используете бросок, чтобы усечь поплавок. Это различие также учитывает DownCasting и UpCasting - объект всегда был "IsA", но тип мог быть обобщен для списка.

Ответ 8

Есть еще одна причина, по которой вам следует использовать Convert.ToInt32 вместо трансляции.

Например:

float a = 1.3f;
float b = 0.02f;
int c = (int)(a / b);
int d = Convert.ToInt32(a / b);`

Результат: c = 64 и d = 65

Ответ 9

номер строки = "123abc";

int num;

Int32.TryParse(число, число);//исключение, вызванное этим вызовом

Convert.ToInt32 (число);//исключение IS выбрано при этом вызове