C#构造函数 - 设置第二个属性

Lib*_*tal 3 c# constructor class

我有这门课:

public class CalendarData_Day
{
    public DateTime Date { get; set; }
    public DayType TypeOfDay { get; set; }
    public bool Choose { get; set; }

    public CalendarData_Day(DateTime datum) : this(datum, DayType.Normal, true)
    {
    }

    public CalendarData_Day(DateTime datum, DayType typDne) : this(datum, typDne, true)
    {
    }

    public CalendarData_Day(DateTime datum, DayType typDne, bool vybran)
    {
        this.Date = datum;
        this.TypeOfDay = typDne;
        this.Choose = vybran;
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望在第二个构造函数中检查DayType是否是Weekend,如果不是那么发送到Choose true但是false.谁知道我该怎么做?我知道我可以添加到最后一个构造函数如果并检查但它似乎不适合我.我认为有更好的方法,我认为我应该以其他方式做到这一点,或者这是在最后一个构造函数中没问题:

if (TypeOfDay == DayType.Weekend)
    this.Choose = false;
Run Code Online (Sandbox Code Playgroud)

我知道它有效,但我不知道这是正确的方法.

编辑:我很抱歉,我没有解释一切.有两个以上的DayTypes,假设有Holiday,Work,...我希望那个用户可以用第二个构造函数调用类,如果DayType是周末或假日那么选择必须是false但是如果它是Normal或者工作应该是真的,或者用户必须使用最后一个构造函数并将DayType设置为Work并选择为false.这很复杂我很抱歉我应该第一次写这篇文章.

Jon*_*eet 7

基于参数传递链式构造函数参数会更好:

public CalendarData_Day(DateTime datum, DayType typDne)
    : this(datum, typDne, typeDne != DayType.Weekend)
{        
}
Run Code Online (Sandbox Code Playgroud)

这样您就不需要将属性设置两次 - 一次设置为某种默认值,然后根据您已知的信息进行修复.

我个人从更改参数名称typDnedayType或类似的东西.

编辑:我刚刚看到你正在考虑将你的测试放入最后一个构造函数而不是第二个构造函数.我希望调用者给出的值vybran可以按原样接受,而不是有条件地忽略.您只描述了要检查的第二个构造函数DayType == Weekend- 而不是最后一个构造函数 - 因此它只是应该更改的第二个构造函数.

编辑:如果周末或假日Choose 必须为假,那么我会在最后一个构造函数中强制执行,但在第二个构造函数中选择:

public CalendarData_Day(DateTime datum, DayType typDne)
    : this(datum, typDne,
           typeDne != DayType.Weekend && typeDne != DayType.Holiday)
{        
}

public CalendarData_Day(DateTime datum, DayType typDne, bool vybran)
{
    if (vybran && (typeDne == DayType.Weekend || typeDne == DayType.Holiday))
    {
        throw new ArgumentException(
           "vybran cannot be true for holiday or weekend dates", "vybran");
    }
    this.Date = datum;
    this.TypeOfDay = typDne;
    this.Choose = vybran;
}
Run Code Online (Sandbox Code Playgroud)