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

标签 c# class constructor

我有这门课:

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;
    }
}

我想在第二个构造函数中检查 DayType 是否为 Weekend,如果不是,则不发送至 Choose true but false。任何人都知道我该怎么做? 我知道我可以添加到最后一个构造函数 if 并检查但它似乎不适合我。我认为有更好的方法,我认为我应该以其他方式进行,或者在最后一个构造函数中是否可以:

if (TypeOfDay == DayType.Weekend)
    this.Choose = false;

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

编辑: 很抱歉我没有解释一切。有超过 2 个 DayTypes,可以说有 Holiday,Work,......我希望用户可以只用第二个构造函数调用类,如果 DayType 是 Weekend 或 Holiday 那么 Choose 必须是 false 但如果它是 Normal 或Work 它应该是 true 或用户必须使用最后一个构造函数并将 DayType 设置为 Work 并将 Choose 设置为 false。这很复杂我很抱歉我应该第一次写这个。

最佳答案

根据参数传递链式构造函数参数会更好:

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

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

我个人会将参数名称从 typDne 更改为 dayType 或类似名称。

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

编辑:如果 Choose must 对于 Weekend 或 Holiday 为 false 那么我会在最后一个构造函数中强制执行但选择 第二个构造函数中的值:

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;
}

关于C# 构造函数 - 设置第二个属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7039149/

相关文章:

c# - 如何在 C# 中对异步文件 IO 进行排队?

java - c - .class 的等价物

c++ - 如何使大量现有功能在类的范围内可用?

构造函数中的 C++ std::vector

c# - 在 C# 中将事件从一个窗体传播到另一个窗体

c# - 无法加载文件或程序集 System.Xml.XPath - .Net 4.6.2 引用 .Net Standard 1.3

java - ArrayList 中子对象的属性和方法不可见

perl - Moose:将参数注入(inject)构造

c++ - 将在构造函数中创建的项目指针分配给类属性

c# - DbContext -> DbSet -> Where 子句丢失( Entity Framework 6)