有没有办法表示在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)
答案 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]
属性,因为
根据具体情况,您有几个选择:
通过使用XML注释,它将被Intellisense选中并在使用构造时显示给开发人员。 Visual Studio通过键入///
将其扩展为
/// <summary>
///
/// </summary>
不是将一个重载标记为更高优先级,而是将其他重载标记为较低优先级。这是通过使用[Obsolete]
属性来完成的,表明强烈建议不要使用该方法。
我会问自己为什么会出现这种情况的问题。为什么你的重载不相等?似乎有一个核心问题需要解决。
考虑使用可选参数来减少现在代码的过载混乱。