Способы преобразование типов в C#
Пишу одну программу на C#. И возник вопрос о способах преобразовании типов.
Первый - используя скобочки
(int)var;
Второй - System.Convert
System.Convert.ToInt32(var);
Так вот, есть ли какие-то отличия в этих способах, случаи когда нужно использовать тот или иной способ. Понятно, что результат один и тот же, получается это просто вопрос о предпочтениях?
Ответы (1 шт):
У этих способов меньше общего, чем вы думаете. Но на самом деле преобразование типа фактически является частью Convert
. Convert
его использует в некоторых из своих перегрузок.
Convert.ToInt32
принимает в качестве агрумента много разных типов данных:
- Числа целые и с плавающей точкой
- Строки
- Дату и время
- И даже объект любого типа
Если возможно, он сделает вам число, если не возможно, не сделает.
У этого подхода ряд недостатков:
- Вы не знаете как точно оно работает. Например, как оно будет округлять дробные или что произойдёт если туда передать экземпляр вообще любого класса. Вы же не будете запоминать, как работает каждая из 19 перегрузок, или будете? Если будете, то этот недостаток отпадает.
- Когда вы кругом используете неявные типы
var
и используете такие преобразования, код становится абстрактным от типов и тяжелее читается. Иногда просто читая код и не используя подсказки IntelliSense невозможно понять, что же было передано в качестве аргумента, или почему оно падает с исключением, когда должно работать, а оказывается вы забыли где-то в другом месте подготовить данные для преобразования или обратились не к тому методу.
Но есть и достоинство: перегрузка ToInt32(String, Int32)
позволяет парсить число из недесятичной системы счисления (2, 8, 16-ричные числа). Convert.ToInt32("10101101", 2)
распарсит двоичное число. Я сам иногда пользуюсь этой перегрузкой, она уникальна и аналогов в .NET не знаю.
Но всё же я рекомендую использовать явные преобразования (int)
. Этот способ выполнит каст типа, если он существует. Если не существует, вы узнаете об этом на этапе компиляции, в отличие от Convert
, потому что там ошибок на этапе компиляции не будет. В целом каст предсказуем и имеет строгое поведение.
С помощью преобразования типа невозможно преобразовать строку в число, но для этого есть метод int.Parse(text)
- он аргументом принимает только строку и легко читается в коде. Кстати, метод .Parse
есть у всех числовых примитивов.
Как итог, рекомендую избегать применения Convert.ToInt32
, так как код с ним иногда сложнее читается и сложнее отлаживается, проще наделать ошибок.