关于过载的最佳做法是什么
本文关键字:是什么 最佳 于过载 | 更新日期: 2023-09-27 18:20:18
我想知道什么是最佳实践,或者至少关于过载,什么更标准。我使用的是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)
第二种方法基本上是相同的,但它将在事务中进行操作
现在我在想我该怎么办?只有一个方法接受null argument作为事务,在这种情况下不使用任何或两个方法,而是非常多地复制/粘贴除事务之外的代码?
这种事情的最佳实践是什么?
编辑:我认为总的想法似乎是在过载之间进行链接。但我仍然想知道,在这种情况下,不接受方法中的null参数是不是一件坏事?
根据DRY原则,您不应该复制粘贴代码。
因此,如果有两个这样的方法,就应该总是有某种链接。
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,3)
替换调用Foo(1,2)
。
现在,假设我们想将c
的默认值更改为4,并在不更改assembly2.dll的情况下更新assembly1.dll。
我们期望调用Foo(1,2,4)
,但实际上,Foo(1,2,3)
仍然被调用,因为默认值存储在调用者的位置!
通过使用重载,默认值3
存储在它所属的assembly1.dll中。
我认为重载比为某些参数传递null
更清楚。我会这样实现:
Foo(string param1, string param2)
{
Foo("param", "param", null);
}
Foo(string param1, string param2, SqlTransaction trans)
{
//Do stuff...
}
这样,您就不必复制和粘贴代码。
让我们假设您的函数接受x个参数。如果只有一个函数,那么您将需要x
if else
来检查如果特定的参数值是否为null该怎么办。
方法重载更加清晰易读。