TypeConverter против Convert vs. TargetType.Parse - PullRequest
36 голосов
/ 10 августа 2011

Насколько я знаю, есть как минимум 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 (особенно из строки в какой-либо другой тип данных)?

Ответы [ 6 ]

4 голосов
/ 01 февраля 2017

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

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

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

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

4 голосов
/ 10 августа 2011

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

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

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

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

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

3 голосов
/ 13 февраля 2012

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

3 голосов
/ 10 августа 2011

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

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

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

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

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

2 голосов
/ 17 ноября 2017

Преобразование

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

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

TypeConverterAttribute

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

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

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

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


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

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

1 голос
/ 10 августа 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...