【问题标题】:Dictionary Boxing字典拳击
【发布时间】:2018-09-30 13:36:55
【问题描述】:

我正在使用 Microsoft XNA Game Studio 4.0 作为我的项目的模板。

在这个项目中,我有一个用于所有实体、射弹等的基类,称为 Sprite

我打算使用单例来处理所有Sprites,因此如果以前使用过它,我不必每次需要它时都创建一个新的Sprite

这是首选,因为 Sprites 有一个 Texture2D 字段以及其他可能占用内存的字段,前提是创建了足够多的 Sprites。

这里是我的Texture2Dsingleton 的一部分作为参考:

public static class TextureManager{
    private static Dictionary<string, Texture2D> allTextures = new Dictionary<string, Texture2D>();
    public static Texture2D GetTexture(string name){
        if(allTextures.ContainsKey(name))
            return allTextures[name];

        ... //Code to handle and create a new key is omitted for simplicity's sake

        return newTexture; //The new texture created from the "name" key
    }
}

这个单例比每次需要时都从内容管道创建新的Texture2D 更受欢迎。代码来源于this answer

在规划Sprite 单例时,我突然想到,必须进行拳击才能使单例在Dictionary 上工作,因为基本上我的所有实体和射弹类都将继承Sprite 类。

问题:

在一个Dictionary 上装箱/拆箱是否比为每种Sprite 设置多个Dictionarys 更有效?

【问题讨论】:

    标签: c# xna xna-4.0


    【解决方案1】:

    这不是拳击……

    装箱是将值类型转换为类型对象或 到此值类型实现的任何接口类型。当 CLR 将值类型框起来,它将值包装在 System.Object 和 将其存储在托管堆上。拆箱从中提取值类型 物体。拳击是隐含的;拆箱是明确的。的概念 装箱和拆箱是 C# 类型系统统一视图的基础 其中任何类型的值都可以被视为一个对象。

    当值类型的值转换为引用类型时,就会发生装箱。将引用类型转换为其基类型不是装箱/拆箱。

    铸造并不是很昂贵,尽管它会产生成本,switch 语句、typeOf 或任何其他方法也是如此。

    简而言之,您必须执行基准测试才能真正找到问题的根源以进行微优化。但是,我认为存储为基本类型会很好。


    其他资源

    【讨论】:

    • 如果我将派生类对象存储到基类Dictionary TValueList&lt;T&gt; T 中,我仍然可以检索派生类对象作为派生类对象?如果是这样,我应该用什么来检索它?
    • @Tau 你必须把它扔回去,我假设你知道你想要检索的类型。另请注意,字典不是线程安全的
    猜你喜欢
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多