推荐具有属性的最佳构造函数?
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]
属性,因为
- 您不了解开发人员的用例,因此无法判断哪个最合适。
- 我希望您不要在代码中留下故意错误的实现,这样就不会出现这种情况。
根据具体情况,您有几种选择:
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
参数,这会导致您的建议与他们需要实现的目标发生冲突。
有没有办法表示在 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]
属性,因为
- 您不了解开发人员的用例,因此无法判断哪个最合适。
- 我希望您不要在代码中留下故意错误的实现,这样就不会出现这种情况。
根据具体情况,您有几种选择:
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
参数,这会导致您的建议与他们需要实现的目标发生冲突。