C#:params关键字与列表

Yar*_*veh 33 c# optimization list params

使用params关键字与List作为某些c#函数的输入有什么利弊?

主要是性能考虑因素和其他权衡因素.

Jim*_*mmy 36

params关键字是由C#编译器处理的语法糖.在引擎盖下面,它实际上在转动

void Foo(params object[] a) { ... }
Foo(1,2,"THREE");
Run Code Online (Sandbox Code Playgroud)

void Foo(object[] a) { ... }
Foo(new object[] { 1, 2, "THREE" })
Run Code Online (Sandbox Code Playgroud)

从你所询问的性能角度来看,params调用只是更快,因为创建数组比创建List <>要快一些.上面两个片段之间没有性能差异.

  • @Mert:但是您还必须为作为引用传递的 list&lt;&gt; 分配内存...... (2认同)
  • @Dan,不,如果列表已经存在,你只需将它作为参考传递给以列表作为参数的方法.如果将列表传递给params作为参数的方法,则需要分配空间并将该列表复制到数组中并将该数组用作参数.所以它有所作为. (2认同)

Ori*_*rds 24

我个人params在编写函数时使用,这些函数接受另一个程序员提供的大量输入(例如String.Format),以及IEnumerable编写带有计算机提供的数据项列表的函数(例如File.Write).

性能影响可以忽略不计.担心像这样的琐碎事情的表现正是唐纳德克努特在着名的"过早优化是所有邪恶的根源"中所说的.

也就是说,提问者似乎已经注意到了,所以你走了:

1000万次迭代的结果:

params took 308 ms
list took 879 ms
Run Code Online (Sandbox Code Playgroud)

从这些结果我们可以看出params数组的速度快了两倍.一个简单的事实,你可以在一秒钟之内调用这些东西千万次,这意味着你完全在浪费你的时间而担心它.使用最适合您代码的任何内容.

测试它的代码(使用VS2008在发布模式下编译和运行)

class Program
{
    const int COUNT = 10000000;

    static IEnumerable<string> m_value = null;

    static void ParamsMethod(params string[] args)
    { m_value = args; } // do something with it to stop the compiler just optimizing this method away

    static void ListMethod(List<string> args)
    { m_value = args; } // do SOMETHING with it to stop the compiler just optimizing this method away

    static void Main(string[] args)
    {
        var s = new Stopwatch();
        s.Start();
        for (int i = 0; i < COUNT; ++i)
            ParamsMethod("a", "b", "c");

        Console.WriteLine("params took {0} ms", s.ElapsedMilliseconds);

        s.Reset();
        s.Start();
        for (int i = 0; i < COUNT; ++i)
            ListMethod(new List<string> { "a", "b", "c" });

        Console.WriteLine("list took {0} ms", s.ElapsedMilliseconds);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 当然可以,但没关系! (11认同)