2012-05-31 2 views
2

Я просматривал структуру DateTime, и я немного смущен.Согласование свойств structs и DateTime

Мое понимание с помощью структур заключается в том, что вы не можете назначать значения по умолчанию. Если используется конструктор по умолчанию для структуры (который не является тем, что вы можете контролировать), то любые поля будут инициализированы с использованием значений по умолчанию для их типа значений.

Это все хорошо и хорошо, но почему же значение по умолчанию для свойства «Дни» DateTime равно 1? Как они снимают это?

William

+0

Как вы создаете экземпляр DateTime? Вы не вызываете конструктор, который бы задавал свойства некоторым значениям, отличным от значения по умолчанию? – mellamokb

+1

DateTime можно рассматривать как тики с 1 января 0001 года. Если вы имеете дело со значением даты и времени по умолчанию, тики равны 0. 0 тиков с 1 января 0001 года делает дату ... 1 января 0001 года. Делает день 1 . –

+1

'DateTime' [не имеет конструктора по умолчанию no-args] (http://msdn.microsoft.com/en-us/library/system.datetime.datetime). – dasblinkenlight

ответ

6

Вы должны понимать разницу между полей и свойств.

В поля инициализированы в 0, но свойства могут делать то, что им нравится с этими полями. Пример:

public struct Foo 
{ 
    private readonly int value; 

    public Foo(int value) 
    { 
     this.value = value; 
    } 

    public int ValuePlusOne { get { return value + 1; } } 
} 

... 

Foo foo = new Foo(); // Look ma, no value! (Defaults to 0) 
int x = foo.ValuePlusOne; // x is now 1 

Теперь очевидно DateTime является smidge более сложной, чем это, но это дает право идея :) Представьте себе, что «А DateTime с полем явно установлен в 0» будет означать ... " по умолчанию "DateTime просто означает точно то же самое.

1

Джон Скит прав, это все о разнице между полями и другими членами. Можно было бы действительно сделать «время дата», как это:

struct MyDateTime 
{ 
    // This is the only instance field of my struct 
    // Ticks gives the number of small time units since January 1, 0001, so if Ticks is 0UL, the date will be just that 
    readonly ulong Ticks; 

    // here goes a lot of instance constructors, 
    // get-only instance properties to show (components of) the DateTime in a nice way, 
    // static helper methods, 
    // and lots of other stuff, but no more instance fields 
    ... 
} 

Таким образом, в действительности, MyDateTime просто обернуты ulong с интерпретацией, и много хороших способов, чтобы показать и манипулировать, что ulong.

Смежные вопросы