【问题标题】:What is a real example of when to use params as a method argument?什么是何时使用 params 作为方法参数的真实示例?
【发布时间】:2011-04-28 17:35:41
【问题描述】:

据我了解,params 只是语法糖,“在后台”只是为您提供您指定类型的数组。

首先,你什么时候用这个?

其次,你为什么要使用它而不是仅仅声明一个数组参数?

【问题讨论】:

  • "你为什么要使用它而不是仅仅声明一个数组参数?"语法糖。这就是重点,不是吗?
  • 走极端,既然都只是语法糖,为什么还要用高级语言编写呢?我们应该只用二进制编写程序。
  • @BoltClock 和 Jim:这种情况下的语法糖似乎非常少。这是 CallMyMethod(1,2,3) 和 CallMyMethod(new int[]{1,2,3}) 之间的区别。看起来很小,所以我认为可能还有更多内容。

标签: c# .net params-keyword


【解决方案1】:

Math.Min 正好有两个参数。这是一个愚蠢的限制。许多其他语言允许您编写:

double x, y, z, w;
double least = min(x, y, z, w);

如果你想编写一个可以像这样使用的min 函数,你会想使用params

【讨论】:

  • 好的,我喜欢。但我认为即使在这里,差异实际上只是更漂亮的代码,对吧?因为您可以改为: double minimum = min(new double[] {x, y, z, w}) 这不会有任何性能差异或其他任何东西。我对么?还有其他好处吗?
  • @Richard:但是高级语言的整个观点是更具表现力的代码。
  • @Jim:是的,我明白了,这里的差异似乎非常小。
  • @Richard:这正是程序所做的。但是,当编译器可以为我转换代码时,为什么我必须编写两倍的代码呢?但是,是的,它是语法糖,并且转换(通常)非常简单。但是,如果函数有多个重载,则可能不太容易确定是否应该进行转换,或者结果数组类型应该是什么。
  • @Ben:是的。现在我正试图获得更深入的理解,所以所有这些语法糖有时会让人难以理解真正正在发生的事情。有时你必须挖掘和挖掘。所以我想看看除了让代码更直观的使用和阅读之外是否还有其他好处。
【解决方案2】:

一个明显的例子可以在String.Format() 之类的方法中找到。这个使用 params 的语句很容易理解:

string.Format("Your name is {0}, {1}", lastName, firstName);

但是没有参数就有点困难了:

string.Format("Your name is {0}, {1}", new string[] { lastName, firstName });

我发现自己对这些字符串函数使用了很多参数。我用它只是为了提高代码的可读性。

【讨论】:

  • 何时创建自己的字符串函数?你说的是这个吗?
  • 是的,比如记录信息或错误消息。我可能有这样的方法签名:void LogInformation(Type objectType, string methodName, string message, params object[] args)。那么我只能说Logger.LogInformation(myType, "method", "{0} called by {1}", "somevalue", "someothervalue");
【解决方案3】:

我使用它的一种方法是将 sql 查询传递给我的包装类。我将有一些带有可变数量参数的sql。这样我可以只列出我通过查询发送的所有参数,而不是先创建一个数组。

    SQLWrapper.Query(" some sql with parameters", new SqlParameter("@param1", val1),
                                                  new SqlParameter("@param1", val1),
                                                  new SqlParameter("@param1", val1));

比替代品好得多:

SQLWr

apper.Query(" some sql with parameters", new SqlParameter[]{new SqlParameter("@param1", val1),
                                                      new SqlParameter("@param1", val1),
                                                      new SqlParameter("@param1", val1)});

当您遇到需要可变数量参数的情况时,它很高兴。

【讨论】:

    【解决方案4】:

    基类库中的一个例子是String.Split(params char[] separator),允许你写,例如:

    var segs = myString.Split(',',';',' ');
    

    而不是

    var sets = myString.Split(new char[] {',', ';', ' '});
    

    【讨论】:

      【解决方案5】:

      我发现自己使用参数的主要不漂亮/更容易理解的原因是执行存储过程。

      以数据库中有数百个存储过程为例。那你真的只有两个选择

      1:为每个需要几个月的存储过程单独编写代码

      2:创建一个通用的执行器方法,它将运行任何存储过程并采用任意数量和类型的参数,例如

      databaseHelper.ExecuteStoredProcedure(
                      "myStoredProecdure",
                      DbProviderHelper.StringParameter("@parameter_string", somestring),
                      DbProviderHelper.BoolParameter("@parameter_string", somebool),
                      DbProviderHelper.IntParameter("@parameter_int", someint));   
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-25
        • 2021-08-13
        • 1970-01-01
        • 2010-11-03
        • 2019-10-12
        相关资源
        最近更新 更多