Как создать класс, который поддерживает мутацию через "obj.MyDate.AddDays"? - PullRequest
1 голос
/ 02 марта 2012

Я хотел бы создать свойство, подкрепленное структурой DateTime, однако, поскольку структуры являются типами значений, MyClass.MyDate.AddDays(1) не работает должным образом для следующего класса:

public class MyClass
{
  public DateTime MyDate { get; set; }
}

желаемым поведением было бы увеличение свойства DateTime на один день, но в моем примере свойство сохраняет свое первоначальное значение.Я могу получить тот же результат с кодом MyClass.MyDate = MyClass.DateTime.AddDays(1), но это нелогично.Я понимаю, почему это не работает, но я не уверен, что лучше всего обойти это.

Каков приемлемый способ создания свойства MyDate, чтобы открытые методы DateTime, такие как AddDays ()?обновить переменную экземпляра?

Ответы [ 5 ]

3 голосов
/ 02 марта 2012

MyClass.MyDate = MyClass.DateTime.AddDays(1)

Это стандартное поведение структуры.Все совместимые со стандартами структуры являются неизменяемыми, кроме тех, для которых ОЧЕНЬ веские причины.

Если у вас действительно есть проблема с вышеуказанным синтаксисом, я рекомендую что-то вроде этого:

public class MyClass
{
    public DateTime MyDate { get; set; }

    public void AddDays(double days)
    {
        this.MyDate = this.MyDate.AddDays(days);
    }
}
1 голос
/ 02 марта 2012

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

Вы можете легко проверить это с помощью этого кода:

DateTime dt = DateTime.Today;
Debug.WriteLine(dt);
dt.AddDays(1);
Debug.WriteLine(dt);

Одна и та же дата будет напечатана дважды. Тот факт, что вы делаете это через свойство, здесь не имеет отношения к проблеме.

Если вам нужны вызовы методов, я бы посоветовал добавить их непосредственно в ваш класс.

Например, вы бы назвали это:

mc.AddDays(1);

вместо этого:

mc.MyDate = mc.MyDate.AddDays(1);

Однако я бы серьезно подумал не делать этого вообще. Это добавляет много бесполезности вашему классу здесь.

Вместо этого я мог бы рассмотреть сэкономленное время с помощью , а не , делая это как сэкономленные деньги и вкладывая их в покупку ReSharper , поскольку в нем есть проверки, которые сообщат вам, что dt.AddDays(1); не имеет никакого эффекта (по крайней мере, для случаев, о которых он знает, например DateTime.)

0 голосов
/ 02 марта 2012
MyClass myClass = new MyClass() { MyDate = DateTime.Now };
myClass.MyDate += new TimeSpan(1, 0, 0, 0);
0 голосов
/ 02 марта 2012

Я хотел бы отметить, что ваша проблема не имеет ничего общего с DateTime структурой. 'String is not struct, but it's immutable the same way DateTime` таков, что MyString.Substring (1,2) также не даст вам того, что вы ожидаете.

Также мое мнение таково, что для опытного разработчика нет ничего нелогичного в этом поведении. Зная, что DateTime является неизменным, мне никогда бы не пришло в голову, что MyClass.MyDate.AddDays(1) должен изменить значение свойства. С чего бы это?

В конце концов, я не думаю, что у вас есть проблема, которую нужно решить, вам просто нужно освоиться с тем, как c # и .net работают

0 голосов
/ 02 марта 2012

Вы показали принятый способ сделать это - поскольку DateTime является неизменяемым, присвойте свойству результат AddDays() снова. Тот факт, что DateTime является неизменным, на самом деле спасает ваш бекон, поскольку, если бы это было не так, вы бы соблазнились , а не снова присвоить свойству, что, конечно, не дало бы ожидаемого результата, поскольку мутируют копию, которая никуда не денется.

Единственный другой способ сделать это "интуитивно" - это использовать класс декоратора для переноса DateTime, который затем может безопасно изменить его так, как вы захотите. Я бы не рекомендовал делать это, так как, по моему мнению, это добавляет сложности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...