Кастинг C# по сравнению с синтаксическим анализом

15
задан Engineert 2 April 2019 в 08:53
поделиться

6 ответов

Если g [0]["MyUntypedDateField"] является действительно объектом DateTime, то бросок является лучшим выбором. Если это не действительно DateTime, то у Вас нет выбора, кроме как использовать Синтаксический анализ (Вы получили бы InvalidCastException, если бы Вы пытались использовать бросок)

12
ответ дан 1 December 2019 в 04:18
поделиться

Кастинг только хороший ответ.

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

в документации ToString говорится, это использует настройки культуры текущего потока. В документации Синтаксического анализа говорится, это также использует настройки культуры текущего потока (пока неплохо - они используют ту же культуру), но существует явный комментарий, что:

Форматирование под влиянием свойств текущего объекта DateTimeFormatInfo, которые по умолчанию получены из Регионального и объекта Опций Языка в Панели управления. Одна причина метод Синтаксического анализа может неожиданно бросить FormatException, то, если текущий DateTimeFormatInfo. DateSeparator и DateTimeFormatInfo. Свойства TimeSeparator установлены на то же значение.

Так в зависимости от пользовательских настроек, код ToString/Parse может и неожиданно перестать работать...

3
ответ дан 1 December 2019 в 04:18
поделиться

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

  1. , если Вы не уверены, эта строка может быть проанализирована, затем использовать DateTime.TryParse().

  2. Всегда включают ссылку на культуру, которую Вы хотите проанализировать как. ToShortDateString() возвраты различные выводы в различных местах. Вы почти наверняка захотите проанализировать использование той же культуры. Я предлагаю эту функцию, справляющуюся с обеими ситуациями;

    private DateTime ParseDateTime(object data)
    {
        if (data is DateTime)
        {
            // already a date-time.
            return (DateTime)data;
        }
        else if (data is string)
        {
            // it's a local-format string.
            string dateString = (string)data;
            DateTime parseResult;
            if (DateTime.TryParse(dateString, CultureInfo.CurrentCulture,
                                  DateTimeStyles.AssumeLocal, out parseResult))
            {
                return parseResult;
            }
            else
            {
                throw new ArgumentOutOfRangeException("data", 
                                   "could not parse this datetime:" + data);
            }
        }
        else
        {
            // it's neither a DateTime or a string; that's a problem.
            throw new ArgumentOutOfRangeException("data", 
                                  "could not understand data of this type");
        }
    }
    

Затем вызов как это;

ParseDateTime(g[0]["MyUntypedDateField").ToShortDateString();

Примечание, что неправильные данные выдают исключение, таким образом, Вы захотите поймать это.

Также; 'поскольку' оператор не работает с Типом данных datetime, как это только работает со ссылочными типами, и DateTime является типом значения.

1
ответ дан 1 December 2019 в 04:18
поделиться

Как @Brian R. Bondy указал, что зависит от реализации [0]["MyUntypedDateField"] г . Безопасная практика должна использовать DateTime. TryParse и как оператор.

0
ответ дан 1 December 2019 в 04:18
поделиться

Синтаксический анализ требует строки для входа, кастинг требует объекта, таким образом, во втором примере Вы обеспечиваете выше, затем Вы обязаны выполнять два броска: один от объекта до строки, затем от строки до DateTime. Первое не делает.

Однако, если существует риск исключения при выполнении броска, затем Вы могли бы хотеть пойти вторым путем, таким образом, Вы можете TryParse и избегать дорогого исключения, которое будет брошено. Иначе пойдите наиболее эффективным путем и просто бросьте однажды (от объекта до DateTime), а не дважды (от объекта представить в виде строки к DateTime).

0
ответ дан 1 December 2019 в 04:18
поделиться

Существует сравнение различных методов в http://blogs.msdn.com/bclteam/archive/2005/02/11/371436.aspx .

0
ответ дан 1 December 2019 в 04:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: