Анализ .Net в сравнении с преобразованием
Вопрос
В .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 под капотом.Так что разница невелика, и на самом деле это просто вопрос личного вкуса.