C#构造函数设计传递变量时可能是两种类型之一

时间:2012-07-25 16:47:36

标签: c# class constructor

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

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

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

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

3 个答案:

答案 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对象可能存在风险。并非所有字符串都可以准确转换。例如,请考虑以下日期:

  • 02-03-2012 - 这个日期是英国式的,也就是3月2日,或美国式的日期,即2月3日?
  • 1月3日 - 哪一年?
  • 2015年1月30日 - 这是指1915年或2015年的Janary 30日?

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

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

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

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