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

TypeConverter против Convert против TargetType.Parse

Насколько я знаю, существует как минимум 3 способа преобразования типов данных в .NET:


с помощью System.ComponentModel.TypeConverter

var conv = System.ComponentModel.TypeDescriptor.GetConverter(typeof(int));
var i1 = (int)conv.ConvertFrom("123");

с помощью System.Convert.ChangeType():

var i2 = (int) Convert.ChangeType("123", typeof (int));

с помощью методов Parse/TryParse типа назначения:

var i3 = int.Parse("123"); // or TryParse



Существуют ли какие-либо рекомендации или правила большого пальца , когда использовать метод для преобразования между базовыми типами данных .NET(особенно из строки в другой тип данных)?

4b9b3361

Ответ 1

В соответствии со своими личными предпочтениями и стандартами кодирования я выбираю между следующими:

  • Convert. Я использую это, когда абсолютно уверен, что значения будут такими, какие я ожидаю.

    int i = Convert.ToInt32("123");
    
  • TryParse. Я использую это, когда обрабатываю пользовательский ввод. Это также имеет преимущество, чтобы иметь возможность использовать локализованное форматирование при разборе.

    int i = 0;
    bool parsed = Int32.TryParse("123", out i);
    

Существует также возможность использовать TryParseExact, где можно проанализировать определенный шаблон. Это может быть полезно в некоторых случаях.

Ответ 2

Как общее правило, вам следует избегать класса Convert. Есть причины использовать его (например, вы не знаете тип источника), но если вы уже знаете, что ваш тип источника - это string, то Parse (или, вернее, TryParse) всегда правильный метод для использования.

Что касается преобразователей типов, они чаще всего используются, когда среда (например, WPF) использует отражение для определения правильного типа преобразователя типов.

Вы забыли другой способ конвертации, то есть прямой бросок. Возьмите этот код, например

object i = 1;
int myInt = (int)i;

Это немного надуманный пример, но я уже знаю, что i - это int, его просто вставляется в object. В этом случае мне не нужно преобразовывать i, мне просто нужно просто применить его к типу, который, как я знаю, уже есть.

Ответ 3

Только что выяснил случай, когда TypeConvert.ConvertFrom(object) выдает исключение. Если вы хотите преобразовать целое число 0/1 в логическое. Вы получите исключение, используя TypeConvert.ConvertFrom(1) или (0). В этом случае работает Convert.ChangeType(1, System.Boolean).

Ответ 4

Я собираюсь опубликовать здесь последние 6 лет, потому что я думаю, что это хороший вопрос, и я не удовлетворен существующими ответами.

Статические методы Parse/TryParse могут использоваться только , если вы хотите преобразовать из строки в тип, который имеет эти методы. (используйте TryParse, когда вы ожидаете, что преобразование может выйти из строя).

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

Что касается System.ComponentModel.TypeConverter, то как тег "typeconverter" , они используются в основном для преобразования в строку и из строки, когда вы хотите предоставить текстовое представление экземпляра класса для использования сериализации конструктора или для отображения в сетках свойств

Ответ 5

Я почти всегда использую методы int/double/etc.Parse(), когда я уверен, что это число. В любом случае, я использую методы .TryParse() как решение "все-в-одном", включая синтаксический анализ и проверку. У меня такое чувство, что проверка и синтаксический анализ в совокупности несколько более эффективны, чем выполнение их отдельно.

TypeConverter, вероятно, полезен только тогда, когда вы не знаете типы во время компиляции.

Ответ 6

Преобразовать

Convert класс использует IConvertible, реализованные в целевом типе.

К сожалению, реализация IConvertible означает запись большого количества кода шаблона и Convert.ChangeType вызывает бокс, если целевой тип является структурой.

TypeConverterAttribute

TypeDescriptor.GetConverter использует TypeConverterAttribute и IMHO предлагает как лучший API для преобразования типа, так и более элегантный способ создания конвертируемого типа. Но он испытывает те же проблемы с производительностью с классом Convert, вызванные тем, что методы не являются общими.

Анализировать /TryParse

Использование методов T.Parse/T.TryParse - это де-факто способ создания объекта из строки, поскольку он не связан с ненужным боксом. Они также обычно имеют перегрузки, которые обеспечивают больший контроль над тем, как разбирать строку.

Методы

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


Таким образом, вы должны вызывать методы типа Parse/TryParse, когда можете и отступать к другим способам, только если вы не знаете тип цели во время компиляции, то есть когда у вас есть только Type объект, который представляет ваш целевой тип.

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