缓存盒装值

时间:2019-07-02 22:24:26

标签: c# boxing

请考虑以下课程; Getter和Caster,其中Getter检索值T。Caster是Getter的包装器,它封装所检索的值,并且本身就是Getter。

public abstract class Getter<T>
{
    public abstract T Get();
}

public class Caster<TIn, TOut> : Getter<TOut>
{
    private Getter<TIn> getter;

    public Caster(Getter<TIn> getter)
    {
        this.getter = getter;
    }

    public TOut Get()
    {
        return (TOut)(object)getter.Get();
    }
}

每次调用Get时,施法者都使用拳击创建垃圾。有什么办法可以缓存盒子并更改值,还是可以避免垃圾?也许有比拳击更好的解决方案?

1 个答案:

答案 0 :(得分:1)

您正在对类型系统做一些坏事情。考虑一下 { "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": "Deploys in the last six hours" } } 会发生什么。您将Caster<int, long>投射到int,这将导致装箱操作。然后,您尝试将装箱的object投射到int上。这将引发long(请参阅here),因为取消装箱必须是明确的-运行时会尝试将InvalidCastException强制转换为{{1 }}。由于装箱的方式,您的类不能用于值类型。如果要启用值类型之间的转换,则可能需要看一下IConvertible界面。