可变数量的参数没有装箱值类型?

DxC*_*xCK 10 .net c# performance boxing value-type

public void DoSomething(params object[] args)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

上述签名的问题是,将传递给该方法的每个值类型都将被隐式装箱,这对我来说是严重的性能问题.

有没有办法去掉一个方法,接受可变数量的参数而不装箱值类型?

谢谢.

Ree*_*sey 13

你可以使用泛型:

public void DoSomething<T>(params T[] args)
{
}
Run Code Online (Sandbox Code Playgroud)

但是,这只允许指定单一类型的ValueType.如果您需要混合或匹配值类型,您必须允许装箱,就像您现在所做的那样,或者为不同数量的参数提供特定的重载.


编辑:如果您需要多种类型的参数,您可以在某种程度上使用重载来完成此操作.

public void DoSomething<T,U>(T arg1, params U[] args) {}
public void DoSomething<T,U>(T arg1, T arg2, params U[] args) {}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这需要为您的类型存在多个重载.

或者,您可以直接传入数组:

public void DoSomething<T,U>(T[] args1, U[] args2) {}
Run Code Online (Sandbox Code Playgroud)

你失去了很好的编译器语法,但是你可以传递任意数量的两个参数.

  • 嗯,他实际上没有在他的问题中明确说明.另一方面,我非常明确地确定了它允许的内容,以及它不允许的内容. (3认同)