关于过载的最佳做法是什么

本文关键字:是什么 最佳 于过载 | 更新日期: 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该怎么办。

方法重载更加清晰易读。