Инициализируйте локальную или динамическую переменную DateTime

1

Скажем, я инициализирую переменную DateTime следующим образом.

Выражение 1

DateTime foo = DateTime.Now;

ВопроС# 1 Я только что построил объект DateTime без явного вызова конструктора?

ВопроС# 2 Возможно ли это, потому что разработчики.NET настроили DateTime Struct со свойствами, которые автоматически создают объект DateTime с датой и временем?

Затем, если я использую этот синтаксис

Выражение 2

DateTime bar = new DateTime();

Я динамически создал структуру DateTime.

Вопрос № 3 Кроме того, что, когда я использую выражение 2, я могу указать любую дату (используя другой конструктор), когда и зачем использовать выражение 1, а не выражение 2?

благодаря

Рожь

Теги:
datetime
variables
initialization

3 ответа

2
Лучший ответ
  1. Да вы сделали. Это очень легко сделать с классами, точно так же, как и с структурами. Рассмотрим следующий фрагмент:

    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. Если бы это было сделано с классом, это бы не так, оно копировало бы только ссылку на объект, но с типами значений каждое присваивание или другая операция для копирования значения переменной в другую переменную строила новый объект.

  2. В нем нет ничего особенного с точки зрения языка. Свойство Now переопределяется, чтобы построить экземпляр, представляющий текущее время, и все. Вы можете запустить любой код, который вы хотите, в getter.

  3. Вы должны использовать DateTime.Now если хотите получить текущее время, а не жестко закодированное время.

2
  1. Вы используете статическое свойство, которое возвращает новый экземпляр DateTime с текущей датой и временем для значений. Поэтому нет, вы явно не вызываете конструктор, но это происходит где-то при выполнении свойства.

  2. Нет. Его ничего особенного, просто статическое свойство.

  3. Nr 1 для текущей даты и времени, nr 2, когда вы хотите сами указать дату и время. Таким образом, нельзя заменить другого, они оба имеют свою цель.

1

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 если вы хотите создать экземпляр определенного времени.

  • 0
    То, что я никогда не буду живым вне этих временных диапазонов, не означает, что я никогда не захочу представлять время вне этого диапазона. История насчитывает более 2 014 лет, и некоторые люди, возможно, захотят сослаться на то, что произошло до того времени. Эти люди не могут использовать DateTime для хранения своего времени.
  • 0
    Но это предполагает, что вы используете DateTime только для представления текущего времени. Это ложное предположение.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню