Лучшая практика: новый DateTime () против DateTime.Синтаксический анализ()

#c# #datetime

#c# #datetime

Вопрос:

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

 var employees = new List<Employee>() 
{ 
    new Employee {Name = "Foo", HireDate = new DateTime(2000, 1, 15)}, 
    new Employee {Name = "Bar", HireDate = new DateTime(2001, 5, 25)}, 
}; 
  

или

 var employees = new List<Employee>() 
{ 
    new Employee {Name = "Foo", HireDate = DateTime.Parse("2000, 1, 15")}, 
    new Employee {Name = "Bar", HireDate = DateTime.Parse("2001, 5, 25")}, 
}; 
  

Я предполагаю, что на самом деле нет большой разницы, но я немного новичок в C #, поэтому я не уверен, что предпочитают большинство программистов C # и почему (производительность, читаемость и т.д.). Заранее спасибо за любую информацию, которую вы можете дать!

Ответ №1:

Предпочитаю new DateTime .

В пользу new , это позволит вам использовать переменные напрямую:

 // clean because the variable is applied directly to the function
int year = 2000;
var date1 = new DateTime(year, 1, 15);
var date1 = new DateTime(year, 7, 3);
var date1 = new DateTime(year, 8, 19);

// kind of gross and prone to errors because it is appended to the string
int day = 23;
var date1 = DateTime.Parse("2001, 5, "   day.ToString());
  

В качестве аргумента против Parse он не обнаруживает ошибок до времени выполнения:

 var date1 = new DateTime(200fdsa, 1, 15); // Error on compile
var date2 = DateTime.Parse("2001fdsjf, 5, 25"); // Must run to find the error
  

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

Однако — в случаях, когда вы должны принимать строковый ввод (например, из текстового файла), вам следует использовать инструмент, созданный для этой работы: DateTime.Parse .


Если вы заинтересованы в упрощении спецификации констант даты / времени в вашем коде, есть библиотека, которую Джон Скит написал для этого.

Он немного устарел и не поддерживается, но конкретный код (методы расширения для целочисленных констант / структуры даты и времени), вероятно, на самом деле не нуждается в большом обслуживании.

Исходный код для этих расширений находится под MiscUtilMiscUtilExtensionsTimeRelated (внутри исходного zip-файла)

Это позволит вам более удобно записывать даты и время, но при этом предоставлять чистый код с производительностью, аналогичной new DateTime(2012, 11, 13) :

 DateTime someDateAndTime = 19.June(1976)   8.Hours();
  

Комментарии:

1. Спасибо, что указали на преимущества и последствия. Это очень проницательно!

2. Это отвечает на все, что я предполагал, но не был уверен. Спасибо!

3. 1 за указание на то, что строки всегда отстой по сравнению с обычным кодом.

Ответ №2:

Я полагаю, что это в конечном счете субъективно, но я не могу представить себе какой-либо веской причины для использования Parse в этой ситуации. Зачем выполнять (неэффективный) синтаксический анализ строки с помощью простого конструктора, который принимает фактические значения компонентов?

Комментарии:

1. Я думаю, это зависит от того, какие данные у вас есть.. Если у вас есть отдельные части в виде целых чисел, обязательно используйте метод без строк. Однако, если у вас есть строковая версия (например, поле datetime в веб-приложении), используйте метод parse .

Ответ №3:

Я бы просто использовал new DateTime() приведенный вами пример. Вы точно знаете, что такое компоненты года / месяца / дня даты. Зачем создавать строку и анализировать ее?