我的类的构造函数有三个传递给它的变量:
public MyClass(int Id, String Name, DateTime StartDate)
但是,StartDate
可能会作为String
或DateTime
对象传递给变量。
我是否应该创建两个不同的构造函数,一个为DateTime
指定StartDate
,另一个为String
?或者,我应该创建类型Dynamic
并确定它在运行时是什么并处理它吗?我问,因为我的班级有五个日期,如果我要为每个不同的组合编写构造函数,那将是太多的代码。
答案 0 :(得分:6)
您应该更强烈地键入来电者而不是"stringly" typed。
创建一个占用5个日期的构造函数,并强制调用者执行正确的操作。这似乎比25个构造者更加理智,他们都必须做正确的事情。
答案 1 :(得分:1)
定义调用默认构造函数的构造函数的重载:
class MyClass
{
public MyClass(int id, string name, DateTime startDate)
{
}
public MyClass(int id, string name, string startDate)
: this(id, name, DateTime.Parse(startDate))
{
}
}
我只会创建一个构造函数,它接受所有作为DateTime对象和一个接受所有作为字符串的重载。我会忽略任何其他组合。事实上,我只接受DateTime。
接受动态类型会导致界面不佳。
答案 2 :(得分:1)
将字符串转换为DateTime对象可能存在风险。并非所有字符串都可以准确转换。例如,请考虑以下日期:
在确定字符串是否可以在整个应用程序中可靠地合法转换为DateTime之前,您需要知道您拥有的转换风险类型。 DateTime.TryParse
是一个很棒的功能,但它不能解决所有潜在的问题。
我建议您在构造函数中坚持使用强类型数据 - 例如DateTime对象:
public MyClass(int id, string name, DateTime StartDate)
然后,将字符串的解析移动到接近这些字符串的位置。例如,如果从源数据文件加载字符串,则可以在文件的加载代码中解析这些字符串,并在错误上抛出异常。另一个例子,如果字符串是由用户键入的,当用户直接错误输入日期时,您可以抛出异常。