C # Casting vs. Parse - PullRequest
       31

C # Casting vs. Parse

15 голосов
/ 15 сентября 2008

Какой из следующих кодов лучше в c # и почему?

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

или

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

В конечном счете, лучше разыграть или проанализировать?

Ответы [ 6 ]

12 голосов
/ 15 сентября 2008

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

3 голосов
/ 15 сентября 2008

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

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

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

На форматирование влияют свойства текущего объекта DateTimeFormatInfo, которые по умолчанию выводятся из элемента «Язык и региональные стандарты» панели управления. Одна из причин, по которой метод Parse может неожиданно вызвать исключение FormatException, заключается в том, что текущие свойства DateTimeFormatInfo.DateSeparator и DateTimeFormatInfo.TimeSeparator имеют одно и то же значение.

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

1 голос
/ 15 сентября 2008

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

  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 является типом значения.

0 голосов
/ 15 сентября 2008

Сравнение различных техник на http://blogs.msdn.com/bclteam/archive/2005/02/11/371436.aspx.

0 голосов
/ 15 сентября 2008

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

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

0 голосов
/ 15 сентября 2008

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

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