【问题标题】:C# Constructor Design when passed variable might be one of two types传递变量时的 C# 构造函数设计可能是两种类型之一
【发布时间】:2012-07-25 16:47:36
【问题描述】:

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

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

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

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

【问题讨论】:

  • 为什么不对字符串之前做一个Convert.ToDateTime你把它放入构造函数,这样你总是得到一个DateTime
  • 为什么你需要支持这个的每一个组合?您的代码中是否真的有一个地方需要传入 3 个DateTimes 和 2 个Strings?

标签: c# class constructor


【解决方案1】:

您应该使调用者的类型更强,而不是"stringly" typed

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

【讨论】:

    【解决方案2】:

    定义调用默认构造函数的构造函数的重载:

    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。

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

    【讨论】:

      【解决方案3】:

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

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

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

      我建议,在您的构造函数中,您坚持使用强类型数据 - 例如日期时间对象:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-05
        • 2021-02-05
        • 2020-03-18
        • 1970-01-01
        • 2021-12-25
        • 1970-01-01
        • 2018-04-10
        相关资源
        最近更新 更多