【问题标题】:Avoid boxing & unboxing in generic class避免在泛型类中装箱和拆箱
【发布时间】:2012-11-08 21:16:35
【问题描述】:

下面是一些快速代码来说明我的问题。有什么办法可以避免这种明显不必要的装箱/拆箱?

public class TestClass<T>
{
  public T TestMethod()
  {
    if (typeof(T) == typeof(bool))
    {
      return true; // doesn't work
      return (T)(object)true; // works, but any way to avoid this?
    }

    return default(T);
  }
}

【问题讨论】:

  • 泛型意味着“相同的代码适用于多种类型”。您需要针对不同类型的不同代码,因此您的用例不在泛型的关注范围内。
  • 如果您只是要检查方法主体中的类型,为什么首先要使其成为通用类型?
  • .NET 运行时没有优化它吗?
  • @dtb, @Servy:它类似于 LINQ 的 Cast&lt;TResult&gt;(this IEnumerable source),但有一些自定义情况,例如“Y”/“N”需要手动转换为真/假。如果 bool 是我自己的类型,我可以使用显式运算符。所有其他类型都是通用处理的。
  • @TravisGockel:这很可能是真的,但它只能用于泛型的TestClass&lt;bool&gt; 版本。

标签: c# generics boxing unboxing


【解决方案1】:

这是处理您在这里所做的事情的唯一方法(为特定的封闭泛型类型返回非默认值)。

【讨论】:

  • 这是我的想法,因为 T 在编译时是未知的,但我想我会尝试。 :)
【解决方案2】:

将其设为静态字段。

public class TestClass<T>
{
  static T TrueIfBoolean = typeof(T) == typeof(bool) ? (T)(object)true : default(T)

  public T TestMethod()
  {
    return TrueIfBoolean;
  }
}

这样,装箱/拆箱只发生一次。即使在您的初始代码中,这种优化也完全有可能由运行时完成。

【讨论】:

  • 我认为不允许编译器优化从值类型到object 的转换。另一方面,如果演员只发生一次,那么浪费的时间将不是一个因素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 2016-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多