与仅创建接收列表或数组的方法有什么区别?
和...之间的不同
void M(params int[] x)
和
void N(int[] x)
M可以这样称呼:
M(1, 2, 3)
或像这样:
M(new int[] { 1, 2, 3 });
但是N只能以第二种方式调用,而不能以第一种方式调用。
也许对性能有影响?
对性能的影响是,无论您M
是以第一种方式还是以第二种方式调用,无论是通过哪种方式创建数组,都必须这样做。创建阵列会对性能产生影响,因为这需要时间和内存。请记住,应该根据绩效目标来衡量绩效影响;创建额外阵列的成本不太可能是门控因素,而门控因素是市场成功与失败之间的差异。
我还不完全了解,也看不出您希望以哪种方式使用无限制参数的方法。
这对于调用该方法的代码的作者来说,纯粹是完全方便。它更短,更容易编写
M(1, 2, 3);
而不是写作
M(new int[] { 1, 2, 3 });
它只是节省了呼叫方的一些按键。就这些。
您没有问过几个问题,但也许想知道以下答案:
这个功能叫什么?
允许在调用方传递可变数量的参数的方法称为variadic。参数方法是C#实现可变参数方法的方式。
重载解析如何与可变参数方法一起使用?
遇到重载解决方案问题时,C#将同时考虑“常规”和“扩展”两种形式,并且如果两者均适用,则“常规”形式总是取胜。例如,考虑一下:
void P(params object[] x){}
我们打个电话
P(null);
有两种适用的可能性。以“普通”形式,我们调用P
并传递该数组的空引用。以“扩展”形式,我们称为P(new object[] { 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)
什么,为什么?这与以前的情况有何不同?