Как работает DateTime в приложении WPF
У меня есть два вопроса.
1) Задача состоит в том, чтобы: Во-первых, запомнить дату первого вхождения в приложение. Во-вторых, при каждом новом запуске приложения считывать нынешнюю дату системы. (Или было бы даже лучше, если бы она считывалась в реальном времени. Т.е. для того чтобы она обновилась не требовалось перезапускать приложение. Теперь расскажу как я пытался решить эту задачу, походу углубляясь в мою реализацию.
//Возможно она не правильная, собственно, поэтому я здесь.
Для начала я создаю 4 переменных:
private DateTime dateForWeek = new DateTime();
private DateTime dateForMonth = new DateTime();
private DateTime dateForYear = new DateTime();
private DateTime date2 = new DateTime();
По идеи первые три должны запомнить дату и оставаться неизменными,
Плюс к ним конструкторы.
public DateTime ADateForWeek {get { return dateForWeek;} set { dateForWeek = value;}}
public DateTime ADateForMonth {get { return dateForMonth; } set { dateForMonth = value; }}
public DateTime ADateForYear {get { return dateForYear; } set { dateForYear = value; }}
public DateTime DateChanging {get { return date2; } set { date2 = value; }}
Я думал, что создав все эти экземпляры, получу для каждого нынешнюю дату. Но как оказалось, это я понял во время проверки, нет. Мне выдаёт 0001-01-01-12:00:00 AM
Затем в конструкторе MainWindow я создал экземпляр:
DateTime DateChanging = new DateTime();
В надежде, что при запуске приложения у меня будет обновляться переменная date2 на текущую дату, чтобы потом в коде проводить сравнения дат, для понимания того, сколько времени прошло (и записывать кол-во помидоров было выполнено в неделю, месяц, год)
Но при проверке там тоже выдаёт странную дату.
Как сделать так, чтобы всё работало?
А вот и моё приложение.
2) В каких случаях нужно писать код в блоке конструктора MainWindow?
public MainWindow()
{
InitializeComponent();
}
Ответы (2 шт):
Прямо в документации написано, что по умолчанию DateTime инициализируется значением DateTime.MinValue:
var dat1 = new DateTime();
// The following method call displays 1/1/0001 12:00:00 AM.
Console.WriteLine(dat1.ToString(System.Globalization.CultureInfo.InvariantCulture));
// The following method call displays True.
Console.WriteLine(dat1.Equals(DateTime.MinValue));
Текущую дату и время можно получить таким образом:
DateTime date1 = DateTime.Now;
Для начала я создаю 4 переменных
Это назвается 4 поля (field)
Плюс к ним конструкторы
А это называется 4 свойства (property)
Почитайте про поля и свойства, чем они отличаются и зачем они нужны.
Для удобства отличать поля от локальных переменных я ставлю _ подчеркивание перед именем поля (но дело вкуса). Так же это избавляет от конфликтов имён.
private DateTime _dateChanging; // приватное поле
public DateTime DateChanging // публичное свойство
{
get { return _dateChanging; }
set { _dateChanging = value; }
}
А инициализировать его можно в обработчике события Window.Loaded
MainWindow.xaml
<Window x:Class="WpfApp1.MainWindow"
...
Loaded="Window_Loaded">
MainWindow.xaml.cs
private void Window_Loaded(object sender, RoutedEventArgs e)
{
DateChanging = DateTime.Now;
// здесь можно делать то что нужно сделать при загрузке программы
}
Обработчик события Window.Loaded вызывается после того как окно полностью загружено и готово к работе, но до того как оно показано пользователю.
Никогда не вставляйте свой код в конструктор окна. Ничего хорошего из этого в конечном итоге не выйдет.
