我想知道最佳做法是什么,或者至少是什么是超载的标准。我使用c#3.5,所以我没有可选参数。假设我有以下方法:
Foo(string param1, string param2)
{
SqlConnection connection = SM.Program.GetConnection();
SqlCommand command = connection.CreateCommand();
command.CommandText = "UPDATE Table" +
"SET Pla = @pla " +
"WHERE Foo = @foo";
try
{
command.Parameters.AddWithValue("@pla", param1);
command.Parameters.AddWithValue("@foo", param2);
connection.Open();
command.ExecuteNonQuery();
}
finally
{
connection.Dispose();
command.Dispose();
}
}
我需要一个带有另一个参数的重载,比如一个sqltransaction
Foo(string param1, string param2, SqlTransaction trans)
第二种方法基本上是相同的,但它会在事务中进行操作
现在我想知道该怎么办?只有一种方法接受一个空的argurment作为交易,在这种情况下,不使用任何或两种方法,但除了交易之外,几乎可以复制/粘贴代码?
什么被认为是这种事情的最佳做法?
编辑:我认为一般的想法似乎是在超载之间进行链接。但我仍然想知道,在这种情况下,接受方法中的null参数是不是一件坏事?答案 0 :(得分:13)
在DRY principle之后,您永远不应该复制粘贴代码。
因此,有这样的两种方法,你应该总是有某种链接。
public void Foo(string param1, param2) {
Foo(param1, param2, null);
}
public void Foo(string param1, string param2, SqlTransaction trans) {
//do stuff, handle null value for trans
}
有关默认参数的更新
在某些情况下,使用单个方法而不是重载提供默认参数可能被视为不良做法,尤其是在编写库时:
//assembly1.dll
public void Foo(int a, int b, int c = 3) { ... }
//assembly2.dll
void Bar() {
Foo(1,2);
}
编译器会使用Foo(1,2)
替换调用Foo(1,2,3)
。
现在,假设我们要将c
的默认值更改为4并更新assembly1.dll而不更改assembly2.dll。
我们希望拨打Foo(1,2,4)
,但实际上仍会调用Foo(1,2,3)
,因为默认值存储在来电者的位置!
通过使用重载,默认值3
存储在它所属的assembly1.dll中。
答案 1 :(得分:1)
我认为重载比传递null
一些参数更清楚。我会像这样实现它:
Foo(string param1, string param2)
{
Foo("param", "param", null);
}
Foo(string param1, string param2, SqlTransaction trans)
{
//Do stuff...
}
这样您就不必复制和粘贴代码了。
答案 2 :(得分:0)
让我们假设你的函数带有x个参数。只有一个函数,那么如果特定参数值为null,则需要x
if else
来检查该怎么做。
方法重载更清晰,更易读。