具有无限参数的c#方法还是具有数组或列表的方法?

具有无限参数的c#方法还是具有数组或列表的方法?,c#,methods,C#,Methods,我最近了解到,您可以创建一些具有无限参数的方法,例如: SomeMethod(params int[] numbers); 但我的问题是,这和仅仅创建一个接收列表或数组的方法有什么区别 SomeMethod(int[] numbers); SomeMethod(List<int> numbers); somethod(int[]数字); 方法(列表编号); 也许它对性能有一些影响?我不完全理解,也不知道你会以什么方式喜欢参数不限的那个 在谷歌上快速搜索没有帮助,我希望你能帮助我

我最近了解到,您可以创建一些具有无限参数的方法,例如:

SomeMethod(params int[] numbers);
但我的问题是,这和仅仅创建一个接收列表或数组的方法有什么区别

SomeMethod(int[] numbers);
SomeMethod(List<int> numbers);
somethod(int[]数字);
方法(列表编号);
也许它对性能有一些影响?我不完全理解,也不知道你会以什么方式喜欢参数不限的那个


在谷歌上快速搜索没有帮助,我希望你能帮助我。

只是做了一个小原型。答案似乎是
params
只是传递数组的语法糖。这并不奇怪。我创建了同一方法的两个版本,其中唯一的区别是“params”关键字。为这两个版本生成的IL是相同的,只是
System.paramaryattribute
应用于
params
版本

此外,在调用站点生成的IL在我使用手动声明的
newint[]
调用方法和仅使用
params
参数调用方法之间也是相同的

因此,答案似乎是“方便”。在性能上似乎没有任何差异。您还可以使用数组调用
params
函数,因此这也就不足为奇了。归根结底,方法的使用者使用任意数量的参数(例如
someMethod(1,2,3)
)调用它是否比总是首先创建一个集合(例如
someMethod(new List(){1,2,3})
)更容易,当您想要发送可选的参数列表时,
params
关键字非常好

就我个人而言,当我的代码类似于

SomeMethod('Option1', 'Option17');

void SomeMethod(params string[] options)
{
    foreach(var option in options)
    {
        switch(option): ...
    }
}
这个方法的好处在于,我可以在任何地方使用这个方法,而不必每次都创建一个数组或列表

我会使用
array
list
当我知道我将始终向这个函数传递一组已经组合在一起的数据时,比如

List<User> users = GetUsersFromDB();
SomeMethod(users);
List users=GetUsersFromDB();
方法(用户);

我认为
params
的好处在于它增加了灵活性。它可能对代码的影响相对较小,但它仍然是一个很好的工具。

调用约定不同。例如

public class Test
{
    public void Method1( params int[] nums )
    {
        nums.ToList().ForEach( n => Console.WriteLine(n) );
    }

    public void Method2( List<int> nums )
    {
        nums.ForEach( n  => Console.WriteLine(n) );
    }   
}

void Main()
{   
    var t = new Test();
    t.Method1( 1, 2, 3, 4 );
    t.Method2( new List<int>() { 1, 2, 3, 4 } );
}
公共类测试
{
公共无效方法1(参数int[]nums)
{
nums.ToList().ForEach(n=>Console.WriteLine(n));
}
公共作废方法2(列出NUM)
{
nums.ForEach(n=>Console.WriteLine(n));
}   
}
void Main()
{   
var t=新测试();
t、 方法1(1,2,3,4);
t、 方法2(新列表(){1,2,3,4});
}
在第一种情况下,您可以向方法传递尽可能多的int作为单独的参数。在第二种情况下,您需要实例化一个列表并传递它

这和仅仅创建一个接收列表或数组的方法有什么区别

两者的区别

void M(params int[] x)

M可以这样称呼:

M(1, 2, 3)
M(new int[] { 1, 2, 3 });
或者像这样:

M(1, 2, 3)
M(new int[] { 1, 2, 3 });
但是N只能用第二种方法调用,不能用第一种方法调用

也许它对性能有一些影响

对性能的影响是,无论您是以第一种方式还是第二种方式调用
M
,都会创建一个数组。创建阵列会影响性能,因为它需要时间和内存。请记住,绩效影响应根据绩效目标进行衡量;创建额外阵列的成本不太可能是决定市场成败的关键因素

我不完全理解,也不知道你会以什么方式喜欢参数不限的那个

对于调用该方法的代码的作者来说,这纯粹是一种方便;它很简单,很短,也很容易写

而不是写作

M(new int[] { 1, 2, 3 });
它只保存了呼叫方的一些按键。仅此而已

有几个问题您没有问,但可能想知道答案:

这个特性叫什么

允许在调用方端传递数量可变的参数的方法称为variadic。Params方法是C#实现可变方法的方式

重载解析如何使用变量方法

当遇到过载解决问题时,C将考虑“正常”和“扩展”两种形式,如果两种形式都适用,则“正常”形式总是获胜。例如,考虑这一点:

void P(params object[] x){}
我们有个电话

P(null);
有两种适用的可能性。在“正常”形式中,我们调用
P
并为数组传递空引用。在“扩展”形式中,我们调用
P(新对象[]{null})
。在这种情况下,正常形式获胜。如果我们有一个调用
P(null,null)
,那么普通形式不适用,扩展形式默认获胜

挑战:假设我们有
var s=new[]{“hello”}和呼叫
P(s)。描述呼叫现场发生的情况以及原因。你可能会感到惊讶

挑战:假设我们有
void p(object x){}
void p(params object[]x){}
P(null)
做什么,为什么


挑战:假设我们有
void M(string x){}
void M(params string[]x){}
M(null)
做什么,为什么?这与前一种情况有什么不同?

无限制参数的功能在许多情况下提供以下好处:

  • 松耦合
  • 增强的可重用性
  • 更好的应用程序总体性能
  • 下面是一个例子,其中无限参数选项是一个不错的选择

    考虑一下