Скажем, я инициализирую переменную DateTime следующим образом.
Выражение 1
DateTime foo = DateTime.Now;
ВопроС# 1 Я только что построил объект DateTime без явного вызова конструктора?
ВопроС# 2 Возможно ли это, потому что разработчики.NET настроили DateTime Struct со свойствами, которые автоматически создают объект DateTime с датой и временем?
Затем, если я использую этот синтаксис
Выражение 2
DateTime bar = new DateTime();
Я динамически создал структуру DateTime.
Вопрос № 3 Кроме того, что, когда я использую выражение 2, я могу указать любую дату (используя другой конструктор), когда и зачем использовать выражение 1, а не выражение 2?
благодаря
Рожь
Да вы сделали. Это очень легко сделать с классами, точно так же, как и с структурами. Рассмотрим следующий фрагмент:
public class MyDateTime
{
public static MyDateTime Now
{
get { return new MyDateTime(); }
}
}
Теперь кто-то может написать MyDateTime.Now
и построить экземпляр типа без (явно) с помощью конструктора.
Конечно, структуры действительно особенные, в том, что я могу написать:
class Foo
{
private DateTime date;
public Foo()
{
Console.WriteLine(date);
}
}
В этом классе конструктор date
никогда не вызывается, но экземпляр даты фактически существует и строится, потому что типы значений инициализируются значением по умолчанию, которое равно побитовым всем нулям. Это не имеет особого отношения к вопросу, но вы спросили.
Также стоит отметить, что структуры копируются при назначении между переменными. Рассмотрим фрагмент:
public static void Foo(DateTime input)
{
DateTime copy = input;
}
Назначение создает новый экземпляр DateTime
. Если бы это было сделано с классом, это бы не так, оно копировало бы только ссылку на объект, но с типами значений каждое присваивание или другая операция для копирования значения переменной в другую переменную строила новый объект.
В нем нет ничего особенного с точки зрения языка. Свойство Now
переопределяется, чтобы построить экземпляр, представляющий текущее время, и все. Вы можете запустить любой код, который вы хотите, в getter.
Вы должны использовать DateTime.Now
если хотите получить текущее время, а не жестко закодированное время.
Вы используете статическое свойство, которое возвращает новый экземпляр DateTime с текущей датой и временем для значений. Поэтому нет, вы явно не вызываете конструктор, но это происходит где-то при выполнении свойства.
Нет. Его ничего особенного, просто статическое свойство.
Nr 1 для текущей даты и времени, nr 2, когда вы хотите сами указать дату и время. Таким образом, нельзя заменить другого, они оба имеют свою цель.
DateTime.Now
является статическим свойством в классе DateTime
который создает и возвращает новый экземпляр на основе текущего локального времени. Вы можете увидеть код для того, что он здесь делает.
Вы явно не вызывали конструктор, но в этом нет ничего особенного. Вы вызвали статическое свойство и создали экземпляр DateTime
на основе текущего времени и вернули его вам. Чтобы быть конкретным, он выполняет некоторую проверку, а затем вызывает internal DateTime(long ticks, DateTimeKind kind, Boolean isAmbiguousDst)
если текущий счетчик internal DateTime(long ticks, DateTimeKind kind, Boolean isAmbiguousDst)
находится внутри диапазона объекта DateTime.
Диапазон DateTime
: # 01/01/0001 12:00:00 AM # до # 12/31/9999 23:59:59 PM #, поэтому проверка диапазона вряд ли когда-либо вступает в игру для DateTime.Now
.
Поэтому используйте DateTime.Now
если вы хотите локальное время. Используйте new DateTime()
(конструктор без параметров), если хотите, эффективно, DateTime.MinValue
. Используйте различные параметрированные конструкторы DateTime
если вы хотите создать экземпляр определенного времени.
DateTime
для хранения своего времени.DateTime
только для представления текущего времени. Это ложное предположение.