2

我的类的构造函数有三个变量传递给它:

public MyClass(int Id, String Name, DateTime StartDate)

但是,StartDate可能会作为 aString或作为DateTime对象传递给变量。

我应该创建两个不同的构造函数,一个指定DateTimefor StartDate,一个指定 asString吗?或者,我应该创建类型Dynamic并在运行时确定它是什么然后处理它?我问是因为我的班级有五个日期,如果我要为每种不同的组合编写构造函数,那将是太多的代码。

4

3 回答 3

6

您应该使调用者的类型更强,而不是“字符串”类型

创建一个需要 5 个日期的构造函数,并强制调用者做正确的事情。这似乎比 25 个必须做正确事情的构造函数要理智得多。

于 2012-07-25T16:54:38.240 回答
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。

接受动态类型会导致界面不佳。

于 2012-07-25T16:50:40.800 回答
1

将字符串转换为 DateTime 对象可能会有风险。并非所有字符串都可以准确转换。例如,考虑这些日期:

  • 02-03-2012 - 这个日期是英式日期,即 3 月 2 日,还是美式日期,即 2 月 3 日?
  • 1 月 3 日 - 哪一年?
  • 1/30/15 - 这是指 1915 年或 2015 年的 1 月 30 日吗?

在您确定字符串是否可以在整个应用程序中可靠地合法转换为 DateTimes 之前,您需要知道您有哪些类型的转换风险。 DateTime.TryParse是一个很棒的功能,但它不能解决所有潜在的问题。

我建议您在构造函数中坚持使用强类型数据 - 例如 DateTime 对象:

public MyClass(int id, string name, DateTime StartDate)

然后,将字符串的解析移到靠近获得这些字符串的位置。例如,如果您的字符串是从源数据文件加载的,您可以在文件的加载代码中解析这些字符串并在错误时抛出异常。再举一个例子,如果字符串是由用户输入的,那么当用户直接输入错误的日期时,您可以抛出异常。

于 2012-07-25T16:54:14.647 回答