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

标签 c# properties

我想要两个简单的属性:开始日期和结束日期。我想限制开始日期必须在结束日期之前。修改两个值时会出现问题 - 它们可能(一起!)形成一个新的正确对,但在添加它们时会出现错误。简单示例:

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/

相关文章:

c# - 与远程队列连接时 MQ 错误 2085

c# - 当前给予排列的所有可能集合

c# - 为什么迭代 GetConsumingEnumerable() 没有完全清空底层阻塞集合

javascript - 从列中删除过滤器

silverlight - 将转换器与 DependencyProperty 结合使用

c# - WebClient.DownloadString() 返回带有特殊字符的字符串

grails - 如何访问在 messages.properties 文件中定义的属性?

javafx - 是否可以创建一个属性来监听 javafx 中自定义对象的更改?

ant - 可选的 Ant arg

c# - 如何在 C# 中获取通用数字类型的最大值和最小值