我有一个使用以下方法的课程。
public cIPLink(int paramCaseNo, int paramIPID, string paramIPReference, int paramContactID)
{
this.cLinkDate = DateTime.Now;
this.cCaseNo = paramCaseNo;
this.cIPID = paramIPID;
this.cIPReference = paramIPReference;
this.cContactID = paramContactID;
string strConnect = BuildConnectionString();
SqlConnection linkToDB = new SqlConnection(strConnect);
linkToDB.Open();
string sqlStat = "INSERT INTO tblIPLinks (LinkID, LinkDate, CaseNo, IPID, ContactID, IPReference)" +
"VALUES (@LinkID, @LinkDate, @CaseNo, @IPID, @ContactID, @IPReference);";
SqlCommand sqlCom = new SqlCommand(sqlStat, linkToDB);
sqlCom.Parameters.Add("@LinkID", SqlDbType.Int);
sqlCom.Parameters.Add("@LinkDate", SqlDbType.Date);
sqlCom.Parameters.Add("@CaseNo", SqlDbType.Int);
sqlCom.Parameters.Add("@IPID", SqlDbType.Int);
sqlCom.Parameters.Add("@ContactID", SqlDbType.Int);
sqlCom.Parameters.Add("@IPReference", SqlDbType.Text);
this.cLinkID = NextLinkID();
sqlCom.Parameters["@LinkID"].Value = this.cLinkID;
sqlCom.Parameters["@LinkDate"].Value = this.cLinkDate;
sqlCom.Parameters["@CaseNo"].Value = this.cCaseNo;
sqlCom.Parameters["@IPID"].Value = this.cIPID;
sqlCom.Parameters["@ContactID"].Value = this.cContactID;
sqlCom.Parameters["@IPReference"].Value = this.cIPReference;
sqlCom.ExecuteNonQuery();
linkToDB.Close();
}
但是我想让它更灵活一些。有时当调用该方法时,我想删除字段IPID,有时我想删除字段ContactID。现在我想到了复制和粘贴这段代码并有三种重载方法;一个只有IPID,一个只有ContactID,第三个有两个字段,但我确信必须有一种更简洁的方式来做我想要的。
有什么想法吗?
答案 0 :(得分:3)
如果您使用的是dotnet 4.0及更高版本,则可以使用可选参数。
public cIPLink(int paramCaseNo, int paramIPID = -1,
string paramIPReference = null, int paramContactID = -1)
所以,从那一刻开始,您可以按如下方式调用它:
cIPLink( paramCaseNo );
cIPLink( paramCaseNo, paramContactID:5 );
答案 1 :(得分:2)
使此方法取为可空int?
而不是普通int
,更改代码以注意这些中的null
值,并添加三个单行重载,将调用转发给do - 工作私人方法。
private void cIPLinkImpl(int paramCaseNo, int? paramIPID, string paramIPReference, int? paramContactID) {
// Your implementation goes here.
// check paramIPID and paramContactID to null before using them here
}
public void cIPLink(int paramCaseNo, int paramIPID, string paramIPReference, int paramContactID) {
cIPLinkImpl(paramCaseNo, paramIPID, paramIPReference, paramContactID);
}
public void cIPLink(int paramCaseNo, string paramIPReference, int paramContactID) {
cIPLinkImpl(paramCaseNo, null, paramIPReference, paramContactID);
}
public void cIPLink(int paramCaseNo, int paramIPID, string paramIPReference) {
cIPLinkImpl(paramCaseNo, paramIPID, paramIPReference, null);
}
答案 2 :(得分:0)
使用C#4.0,您可以使用命名和可选参数。所以如果你有这样的方法:
static int CalculateBMI(int weight, int height)
{
return (weight * 703) / (height * height);
}
你可以这样称呼它:
Console.WriteLine(CalculateBMI(123, 64));
或者喜欢以下任何一种:
Console.WriteLine(CalculateBMI(weight: 123, height: 64));
Console.WriteLine(CalculateBMI(height: 64, weight: 123));
Console.WriteLine(CalculateBMI(123, height: 64));
在声明上设置初始值使它们成为可选:
public int area(int height = 0, int width = 0)
{
return height * width;
}
答案 3 :(得分:0)
如果使用C#4.0
,请使用可选参数答案 4 :(得分:0)
您可以使用默认参数,例如
public cIPLink(int paramCaseNo, string paramIPReference, int paramIPID = -1, int paramContactID = -1)
答案 5 :(得分:0)
其中一个想法是将这些参数移到类中,例如:
public class QueryParameters
{
public int? CaseNo {get;set;}
public int? IPID {get;set;}
public string IPReference {get;set;}
public int? ContactID {get;set;}
}
然后,不是传递许多参数作为参数,而是传递QueryParameters类型的单个参数,并在传递给方法时填充QueryParameters的必需属性:
QueryParameters queryParameters = new QueryParameters();
queryParameters.IPReference = "blabla";
...
public cIPLink(QueryParameters queryParameters)
{
if (queryParameters.CaseNo.HasValue) {
....
}
...
}
总的来说,建议使用方法,不要有更多的4-5方法参数,更好地将它们重构为单独的类。
答案 6 :(得分:0)
您可以将参数的默认值设置为null,然后在逻辑中检查并设置它们:
void method(int value = -1, string something = null) {
if (value != -1) ... add parameter
if (something != null) ... add parameter
}