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



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



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

639   9  

9 ответов:

посмотреть различия между Cast и Convert на другом форуме

ответ

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

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


обновление

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

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

int i = (int)o; когда вы знаете, что o-это int

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

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

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

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

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

но:

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

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

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

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

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

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

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

литье изменяет тип представления. Таким образом, "32" и 32L и 32.0 f кажутся разумными, чтобы бросить между собой. c# не будет поддерживать "32" автоматически, но большинство динамических языков будет. Так что я буду использовать (длинный)"32" или (строка)32л. Когда я могу. У меня также есть еще одно правило-кастинг должен быть круглым.

преобразование не должно быть круглый trippable, и может просто создать совершенно новый объект.

серая область - это, например, строка "32xx". Можно сделать так, что когда вы его бросаете, он становится 32L (число было проанализировано, пока оно не могло быть). Перл использовал это. Но тогда это нарушает мое требование туда и обратно. То же самое касается 32.5 F до 32л. Почти все языки в том числе и очень статически типизированный позволили этого, и это тоже не правило круглые trippable. Это серый в том, что если вы позволите" 32 " быть брошенным, тогда во время компиляции вы не знаете, может ли это быть "32xxx".

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

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

есть еще одна причина, по которой Вы должны использовать 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

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

int num;

типа int32.TryParse(number, out num); / / никаких исключений при этом вызове

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

Comments

    Ничего не найдено.