我想要两个简单的属性:开始日期和结束日期.我想设置一个约束条件,即开始日期必须在结束日期之前.修改两个值时会出现问题 - 它们可能(一起!)组成一个新的正确对,但在添加它们时,会出现错误.简单的例子:
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)
好吧,你可能会考虑一个代表开始/结束组合的类型是否有意义.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)