【问题标题】:Passing C# value type by reference to avoid boxing通过引用传递 C# 值类型以避免装箱
【发布时间】:2014-09-17 23:55:28
【问题描述】:

在 C# 中避免装箱的一种方法是 pass the value type by reference。我读过generic method can also be used to avoid boxing。虽然仅仅为了避免装箱而编写一个泛型方法似乎有点极端——如果类型总是相同的话。

我的问题是 - 如果编写代码以获得最佳性能并避免装箱,通过引用传递所有值类型(如 int)是否合理 - 即使所讨论的方法仅适用于对象而不是创建它?这样做有什么缺点吗?

【问题讨论】:

  • 如果类型总是相同的为什么要声明采用object的方法(这会导致装箱操作)?只需声明它采用您期望的值类型,不会有装箱。
  • 如果“类型始终相同”,拳击将来自哪里?如果您的方法采用该特定类型,则没有装箱...示例代码可能会澄清它。
  • “通过引用传递所有值类型(如 int)” --- 为什么你认为它应该提高性能?
  • 检查此链接stackoverflow.com/questions/3395873/… 并放置一些您尝试实现的代码示例,然后我们可以提供一些建议。
  • 当您可以查看生成的代码时,假设任何事情都是毫无意义的。方便使用 idlasm.exe 很重要,您始终可以看到 BOX 指令。不,这不会发生,并且通过引用传递值是非常低效的。在您衡量您需要帮助之前,切勿提供帮助。那你看看。

标签: c# performance parameter-passing


【解决方案1】:

避免值类型装箱的最佳方法是:将它们用作值!

我认为您完全误读了该参考资料。它说的是使用ref 参数不会导致装箱。并不是说这是avoid拳击的一种方式。

在引用上下文中使用值类型时会发生装箱,例如强制转换为对象。这篇文章说,通过引用传递参数一定不能和引用类型的概念混淆,但混淆它们似乎正是你所做的。

280Z28 总结:

也就是说,避免以下两种操作:

  1. 将值强制转换或分配给 object 类型的变量(或将值作为参数传递给 object 类型的方法参数)。
  2. 将值强制转换或分配给 interface 类型的变量(例如IEnumerable),或将值作为参数传递给作为接口类型的方法参数。李>

此规则有一些例外情况(例如调用一些泛型方法),并且在某些情况下可能会在其他上下文中发生装箱,但是当您试图避免对值类型进行不必要的装箱时,这些是需要注意的主要情况.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 2014-05-05
    • 2020-04-01
    • 1970-01-01
    • 2019-03-07
    相关资源
    最近更新 更多