Анализ .Net в сравнении с преобразованием

StackOverflow https://stackoverflow.com/questions/18465

  •  09-06-2019
  •  | 
  •  

Вопрос

В .Net вы можете прочитать строковое значение в другой тип данных, используя либо <datatype>.parse или Convert.To<DataType>.

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

Итак, какой способ лучше всего подходит в каких обстоятельствах?

Это было полезно?

Решение

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

//o is actually a boxed int
object o = 12345;

//unboxes it
int castVal = (int) 12345;

//o is a boxed enum
object o = MyEnum.ValueA;

//this will get the underlying int of ValueA
int convVal = Convert.ToInt32( o );

//now we have a string
string s = "12345";

//this will throw an exception if s can't be parsed
int parseVal = int.Parse( s );

//alternatively:
int tryVal;
if( int.TryParse( s, out tryVal ) ) {
    //do something with tryVal 
}

Если вы компилируете с флагами оптимизации, TryParse выполняется очень быстро - это лучший способ получить число из строки.Однако, если у вас есть объект, который может быть int или преобразовываться в строку.ToInt32 работает быстрее.

Другие советы

Вот ответ для вас:

http://www.dotnetspider.com/forum/ViewForum.aspx ?ForumId=77428

Хотя я думаю, что в современных версиях .NET лучшее, что можно сделать, это использовать TryParse в любом случае, если есть какие-либо сомнения в том, что преобразование сработает.

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

Обычно мой заказ таков:

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

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

Если вам нужна скорость, я почти уверен, что прямое приведение - самый быстрый способ.При этом я обычно использую .Parse или .TryParse, потому что это, кажется, облегчает чтение и делает поведение более предсказуемым.

Я полагаю, Convert на самом деле вызывает Parse под капотом.Так что разница невелика, и на самом деле это просто вопрос личного вкуса.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top