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

时间:2013-06-27 12:02:43

标签: c#

我想知道最佳做法是什么,或者至少是什么是超载的标准。我使用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参数是不是一件坏事?

3 个答案:

答案 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来检查该怎么做。

方法重载更清晰,更易读。