3

我想知道最佳实践是什么,或者至少对过载更标准。我使用的是 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 方法中的参数是一种坏事吗?

4

3 回答 3

15

按照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)Foo(1,2,3).

现在,假设我们要将默认值更改为c4 并在不更改 assembly2.dll 的情况下更新 assembly1.dll。

我们期望调用Foo(1,2,4)但实际上Foo(1,2,3)仍然被调用,因为默认值存储在调用者的位置!

通过使用重载,默认值3存储在它所属的 assembly1.dll 中。

于 2013-06-27T12:06:03.240 回答
1

我认为重载比传递null一些参数更清晰。我会这样实现它:

Foo(string param1, string param2)
{
    Foo("param", "param", null);
}

Foo(string param1, string param2, SqlTransaction trans)
{
    //Do stuff...
}

这样您就不必复制和粘贴代码。

于 2013-06-27T12:06:31.230 回答
0

假设您的函数采用 x 个参数。只需一个函数,您就需要x if else检查特定参数值是否为 null 时该怎么做。

方法重载更加清晰易读。

于 2013-06-27T12:08:51.580 回答