2011-08-12 44 views
3

我有这个类:C#构造函数 - 设置第二个属性

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是周末,如果是则不会发送到选择正确的,但假的。任何人都知道我该怎么做? 我知道我可以添加到最后的构造函数,如果和检查,但它不适合我。我认为有更好的办法,我认为我应该做的另一种方式,或者这是去年构造器好吗:

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

我知道it's工作,但我不知道这是正确的方式。

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

回答

7

这将是更好的通过基于参数链式构造函数的参数:

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

这样,你不需要设置该属性两次 - 一次到一种默认值,然后解决它根据你已经知道的信息。

我会亲自将参数名称从typDne更改为dayType或类似的东西。

编辑:我刚刚看到你正在考虑把您的测试进入最后构造而不是之一。我希望调用者给出的值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; 
} 
+0

我喜欢你的解决方案,但我很抱歉忘记提及它不仅仅是DayType.Weekend和Normal,它可能更多类型,所以我认为我必须在最后一个构造函数中设置属性两次。 –

+0

@Bibo:为什么?我的方法确实如你所描述的那样 - 如果'typeDne'是Weekend,则选择将为false,否则为true ...并且为什么要重写直接调用最后一个构造方法时用户传入的内容?如果*真*是你的意图,请编辑你的问题来澄清它。考虑如果用户*直接*调用'新的CalendarData_Day(日期,DayType.Weekend,真)会发生什么' –

+0

周末应该永远是假的,但你是对的,它可以在一些情况下混乱,所以我编辑我的帖子。 –

4

验证您的构造函数中的参数是完全正确的。

虽然你应该确保,如果条件为假你的代码仍然按预期工作:

if (TypeOfDay == DayType.Weekend) 
{ 
    this.Choose = false; 
} 
else 
{ 
    this.Choose = vybran; 
} 

您可以考虑抛出ArgumentException如果传入的参数是完全错误的。

+1

通常,当我看到一个“如果”所有情况正在发生变化的两个机构是相同的方式使用的值,我使用条件或其他一些表达式,会得到正确的答案。在这种情况下:'this.Choose = TypeOfDay!= DayType.Weekend;'。如果您想使比较更清楚,请使用括号。 –

+0

@Jon - 同意,除非你想要测试失败时的实际传入值。你的版本和我的做不同的事情。 – Oded

+0

@Downvoter - 谨慎评论? – Oded

0

如果你有很在你的一个构造函数中有大量的逻辑,你可能从调用私有构造函数的静态构造函数中受益。

class MyClass 
{ 
    private MyClass(...) 
    { 

    } 
    public static MyClass CreateMyClassWithValidation(...) 
    { 
    if(....) 
     return new MyClass(...); 
    } 
} 
相关问题