c# - 可变数量的参数而无需将值类型装箱?

标签 c# .net performance boxing value-type

public void DoSomething(params object[] args)
{
    // ...
}

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

有没有一种方法可以取消不接受值类型的框而接受可变数量的参数的方法?

谢谢。

最佳答案

您可以使用泛型:

public void DoSomething<T>(params T[] args)
{
}

但是,这仅允许指定一种类型的ValueType。如果需要混合或匹配值类型,则必须像现在一样允许装箱,或者为不同数量的参数提供特定的重载。

编辑:如果需要多个类型的参数,则可以在某种程度上使用重载来完成此操作。
public void DoSomething<T,U>(T arg1, params U[] args) {}
public void DoSomething<T,U>(T arg1, T arg2, params U[] args) {}

不幸的是,这要求您的类型存在多个重载。

或者,您可以直接传递数组:
public void DoSomething<T,U>(T[] args1, U[] args2) {}

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

关于c# - 可变数量的参数而无需将值类型装箱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1890981/

相关文章:

mysql - MySQL 查询速度慢 - 如何才能加快速度?

c# - 如何设置 UWP 元素的状态?

.net - 简单代数简化的算法/操作方法

c# - WPF - 当我从其他窗口添加项目时,Observablecollection 绑定(bind)的 DataGrid 没有更新

c# - app.config 中的 maxReceivedMessageSize 和 maxBufferSize

c# - 如何使用 MS 随机指标

javascript - Three.js 为什么使用 for 循环而不是 while

java - 单独线程中的屏幕捕获导致 Java 应用程序缓慢/无响应

c# - SqlDbType.Structured 是什么意思?

c# - WPF 组合框值和显示文本