两个日期作为C#中的属性

Pat*_*ski 2 c# properties

我想要两个简单的属性:开始日期和结束日期.我想设置一个约束条件,即开始日期必须在结束日期之前.修改两个值时会出现问题 - 它们可能(一起!)组成一个新的正确对,但在添加它们时,会出现错误.简单的例子:

start = 5;
end = 10;

new_start = 20;
new_end = 30;

start = new_start; // error!
end = new_end;
Run Code Online (Sandbox Code Playgroud)

这就是我介绍第三个属性的原因.问题是 - 代码看起来很糟糕(尤其是.Item1,.Item2).

有没有办法在C#中以更好的方式做到这一点?

    private DateTime start;
    private DateTime end;

    public DateTime Start { get { return start; } }
    public DateTime End { get { return end; } }


    public Tuple<DateTime, DateTime> Dates
    {
        get
        {
            return new Tuple<DateTime, DateTime>(Start, End);
        }
        set
        {
            if (value.Item1 <= value.Item2)
            {
                start = value.Item1;
                end = value.Item2;
            }
            else
                throw new InvalidDates();
        }
    }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 9

好吧,你可能会考虑一个代表开始/结束组合的类型是否有意义.A排序的... Interval.(是的,这是一个不那么微妙的插头野田的时间,这使日期/时间一般都比较好处理无妨.但是你可以创建自己的Interval结构为DateTime,如果你想...),那么你可以有一个单独的属性合并开始/结束时间,保证有效.

但如果你真的想把它们作为单独的属性,我会选择一个简单的setter.我不会为此创建一个单独的例外 - 只需使用ArgumentException:

public void SetDates(DateTime start, DateTime end)
{
    if (end < start)
    {
        throw new ArgumentException("End must be at or after start", "end");
    }
    this.start = start;
    this.end = end;
}
Run Code Online (Sandbox Code Playgroud)