#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()
приведенный вами пример. Вы точно знаете, что такое компоненты года / месяца / дня даты. Зачем создавать строку и анализировать ее?