推荐具有属性的最佳构造函数?

时间:2015-02-13 17:07:26

标签: c# constructor

有没有办法表示在C#中使用的最佳构造函数,以便开发人员知道默认选择哪个?

假设你有一个班级:

public class MyClass
{
    public MyClass(int requestReferenceId, int controlNumber1, string companyNumber, int recordId, DateTime mySpecialDate, DateTime myOtherDate, bool isProduction)
        : this(controlNumber1, controlNumber1, companyNumber, recordId, mySpecialDate, myOtherDate)
    {
        IsProduction = isProduction;
    }

    public MyClass(int requestReferenceId, int controlNumber1, string companyNumber, int recordId, DateTime mySpecialDate, DateTime myOtherDate)
        : this(requestReferenceId, controlNumber1, companyNumber, recordId)
    {
        MySpecialDate = mySpecialDate;
        MyOtherDate = myOtherDate;
    }

    public MyClass(int requestReferenceId, int controlNumber1, string companyNumber, int recordId, DateTime mySpecialDate)
        : this(requestReferenceId, controlNumber1, companyNumber, recordId)
    {
        MySpecialDate = mySpecialDate;
        MyOtherDate = mySpecialDate;
    }

    public MyClass(int requestReferenceId, int controlNumber1, string companyNumber, int recordId)
        : this()
    {
        if (controlNumber1 == 0)
            throw new ArgumentException("Invalid Parameter: cannot be 0", "controlNumber1");
        if (recordId == 0)
            throw new ArgumentException("Invalid Parameter: cannot be 0", "recordId");
        if (string.IsNullOrWhiteSpace(companyNumber))
            throw new ArgumentException("Invalid Parameter: cannot be empty", "companyNumber");

        RequestReferenceId = requestReferenceId == 0 ? 1 : requestReferenceId;
        ControlNumber1 = controlNumber1;
        ControlNumber2 = controlNumber1;
        RecordId = recordId;
        CompanyNumber = companyNumber;

    }
    public MyClass()
    {
        MyStringProperty = string.Empty;
        MySpecialDate = DateTime.Now;
        MyOtherDate = MySpecialDate;
        RequestReferenceId = 1;
        ControlNumber1 = 1;
        ControlNumber2 = 1;
        TransactionNumber = 1;
        ReferenceNumber = 1;
        IsProduction = true;
    }

    public string MyStringProperty { get; set; }
    public DateTime MySpecialDate { get; set; }
    public DateTime MyOtherDate { get; set; }
    public bool IsProduction { get; set; }
    public int RequestReferenceId { get; set; }
    public int ControlNumber1 { get; set; }
    public int ControlNumber2 { get; set; }
    public int TransactionNumber { get; set; }
    public int ReferenceNumber { get; set; }
    public string CompanyNumber { get; set; }
    public int RecordId { get; set; }

    public string TraceNumber
    {
        get {  return string.Format("{0}-{1}", ControlNumber2, RecordId)}
    }

}

并且想通知开发人员以下版本是推荐使用的版本:

public MyClass(int requestReferenceId, int controlNumber1, string companyNumber, int recordId, DateTime mySpecialDate)

C#中是否有类似下面的内容来执行此操作?我知道你可以在内部组成一个属性,但是有一个C#功能吗?我错过了什么基本的......哎呀... C#?

[Recommended]
public MyClass(int requestReferenceId, int controlNumber1, string companyNumber, int recordId, DateTime mySpecialDate)

2 个答案:

答案 0 :(得分:5)

首先,我建议你将构造函数链接到其他方式 - 使用 all 将具有较少参数链(可能间接)的构造函数链接到单个构造函数参数,并使其成为唯一一个设置任何东西。这样就可以保存你的作业,因为它们正在分散在各个地方

其次,我考虑使用可选参数而不是所有重载:

public MyClass(
    int requestReferenceId,
    int controlNumber1,
    string companyNumber,
    int recordId,
    DateTime mySpecialDate, = default(DateTime)
    DateTime myOtherDate = default(DateTime),
    bool isProduction = false)
{
    ...
}

然后你只有一个构造函数,所以你不必“推荐”任何东西。开发人员必须为所有必需参数指定参数,但可以选择为其指定参数的可选参数。不要忘记不同的开发人员可能处于不同的上下文中 - 如果您建议在没有isProduction参数的情况下重载,但他们希望指定isProduction参数,这会导致你的建议与他们需要达到的目标之间的冲突。

答案 1 :(得分:4)

没有[Recommended]属性,因为

  1. 您不知道开发人员的用例,因此您无法确定哪个最合适。
  2. 我希望你不要在你的代码中留下明显不好的实现,这样就不会出现这种情况。
  3. 根据具体情况,您有几个选择:

    XML评论

    通过使用XML注释,它将被Intellisense选中并在使用构造时显示给开发人员。 Visual Studio通过键入///将其扩展为

    ,为此提供了一个快捷方式
    /// <summary>
    /// 
    /// </summary>
    

    [作废]

    不是将一个重载标记为更高优先级,而是将其他重载标记为较低优先级。这是通过使用[Obsolete]属性来完成的,表明强烈建议不要使用该方法。


    我会问自己为什么会出现这种情况的问题。为什么你的重载不相等?似乎有一个核心问题需要解决。

    考虑使用可选参数来减少现在代码的过载混乱。