Вопрос

Какой из перечисленных ниже кодов лучше на c # и почему?

((DateTime)g[0]["MyUntypedDateField"]).ToShortDateString()

или

DateTime.Parse(g[0]["MyUntypedDateField"].ToString()).ToShortDateString()

В конечном счете, что лучше - приведение или синтаксический анализ?

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

Решение

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

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

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

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

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

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

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

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

  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();

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

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

Как @Brian R.Бонди отметил, что это зависит от реализации g[0]["MyUntypedDateField"].Безопасная практика заключается в использовании Дата-время.Попробуйте проанализировать и как оператор.

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

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

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

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