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

Rob*_*ann 2 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)}
    }

}
Run Code Online (Sandbox Code Playgroud)

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

public MyClass(int requestReferenceId, int controlNumber1, string companyNumber, int recordId, DateTime mySpecialDate)
Run Code Online (Sandbox Code Playgroud)

C#中有什么东西可以像下面这样做吗?我知道你可以在内部组成一个属性,但是有一个C#功能吗?我错过了什么基本的......哎呀... C#?

[Recommended]
public MyClass(int requestReferenceId, int controlNumber1, string companyNumber, int recordId, DateTime mySpecialDate)
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

首先,我的建议你链构造的其他方式圆-进行较少的参数链的那些(可能间接)一个构造函数与所有的参数,并作出其设定的任何唯一的一个.这样可以节省你的作业,因为它们正在分散在各个地方

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

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

那么你只有一个构造函数,所以你不必"推荐"任何东西.开发人员必须为所有必需参数指定参数,但可以选择为其指定参数的可选参数.不要忘记不同的开发人员可能处于不同的上下文中 - 如果您建议在没有isProduction参数的情况下重载,但他们想要指定isProduction参数,则会导致您的建议与他们需要实现的内容之间发生冲突.