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

Recommend best constructor with attribute?

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

假设你有一个 class:

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)

没有 [Recommended] 属性,因为

  1. 您不了解开发人员的用例,因此无法判断哪个最合适。
  2. 我希望您不要在代码中留下故意错误的实现,这样就不会出现这种情况。

根据具体情况,您有几种选择:

XML 评论

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

有一个快捷方式
/// <summary>
/// 
/// </summary>

[已过时]

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


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

考虑使用可选参数来减少当前代码的重载混乱。

首先,我建议您以 other 的方式将您的构造函数链接起来 - 将参数较少的那些链接(可能间接)到具有 [=19 的单个构造函数=]all 参数,并使它成为唯一设置任何内容的参数。这样可以避免您的作业像现在一样分散在各处

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

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

那么你只有一个构造函数,所以你不需要 "recommend" 任何东西。开发人员必须为所有必需的参数指定参数,但可以选择他们为哪些可选参数指定参数。不要忘记,不同的开发人员可能处于不同的上下文中 - 如果您建议不使用 isProduction 参数的重载,但他们 想要 指定 isProduction 参数,这会导致您的建议与他们需要实现的目标发生冲突。