我想要两个简单的属性:开始日期和结束日期。我想限制开始日期必须在结束日期之前。修改两个值时会出现问题 - 它们可能(一起!)形成一个新的正确对,但在添加它们时会出现错误。简单示例:
start = 5;
end = 10;
new_start = 20;
new_end = 30;
start = new_start; // error!
end = new_end;
这就是我介绍第三个属性的原因。问题是 - 代码看起来很糟糕(尤其是 .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();
}
}
最佳答案
嗯,您可能会考虑使用表示开始/结束组合的类型是否有意义。一种... Interval
. (是的,这是 Noda Time 的一个不那么微妙的插件,它使日期/时间处理通常更好。但是你可以为 DateTime
创建你自己的 Interval
结构> 如果你想要...) 然后你可以有一个单个属性来组合开始/结束时间,以保证有效的方式。
但如果您真的想将它们作为单独的属性保留,我会选择一个简单的 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;
}
关于c# - 两个日期作为 C# 中的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29131228/