加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 00:23:21 所属栏目:百科 来源:网络整理
导读:我想知道什么是最佳实践,或者至少是什么是超载的标准.我正在使用c#3.5,所以我没有可选参数.假设我有以下方法: Foo(string param1,string param2){ SqlConnection connection = SM.Program.GetConnection(); SqlCommand command = connection.CreateCommand(
我想知道什么是最佳实践,或者至少是什么是超载的标准.我正在使用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 argurment作为事务的方法,在这种情况下,不使用任何或2种方法,但除了事务之外,还可以使用mutch复制/粘贴代码?

什么被认为是这种事情的最佳做法?

编辑:我认为一般的想法似乎在超载之间进行链接.但我仍然想知道在那种情况下不接受null参数的方法是一种坏事吗?

解决方法

在 DRY principle之前,你永远不应该复制粘贴代码.

因此,有这样的两种方法,你应该总是有某种链接.

public void Foo(string param1,param2) {
       Foo(param1,param2,null);
}

public void Foo(string param1,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并更新assembly1.dll而不更改assembly2.dll.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读