C# 对对象使用Indexer时是否有性能提升?

C# 对对象使用Indexer时是否有性能提升?,c#,indexer,C#,Indexer,假设我必须为一个类flyweight创建三个对象,那么创建这样的对象有什么区别 flyweight f1=new flyweight(); flyweight f2=new flyweight(); flyweight f3=new flyweight(); 像这样 public class flyweight { flyweight[] obj = new flyweight[3]; public flyweight this[int index] {

假设我必须为一个类flyweight创建三个对象,那么创建这样的对象有什么区别

flyweight f1=new flyweight();
flyweight f2=new flyweight();
flyweight f3=new flyweight();
像这样

public class flyweight
{
    flyweight[] obj = new flyweight[3];
    public flyweight this[int index]
    {
        get{
            if (index < 3) {
                obj[index] = new flyweight();
            }
            return obj[index];
        }
    }
    public void display() {
        Console.WriteLine("this is a object");
    }
    public void load() {
        flyweight f = new flyweight();
        for (int i = 0; i < 3; i++) {
            f[i].display();
        }
    }
}
公共级飞锤
{
飞锤[]obj=新飞锤[3];
公共飞行重量此[整数索引]
{
得到{
如果(指数<3){
obj[索引]=新的飞锤();
}
返回obj[索引];
}
}
公共空间显示(){
Console.WriteLine(“这是一个对象”);
}
公共空荷载(){
飞锤f=新飞锤();
对于(int i=0;i<3;i++){
f[i].display();
}
}
}

当我们使用Indexer创建对象时,性能有什么提高吗?

索引属性被编译为一个简单的
公共flyweight get_Item(int index)
方法。调用方法并不比直接访问变量
f1
f2
f3
快(尽管我没有证据证明这一点)


如果您在这个级别上进行优化,而没有性能问题的证据,那么您可能最终会遇到一个速度较慢的应用程序,其中充满了bug,因为您的应用程序布局非常混乱

如果可以使用双重方法,使用实例变量和数组:

var f1 = new flyweight();
var f2 = new flyweight();
var f3 = new flyweight();
var flyweights = new[] { f1, f2, f3 };

这允许您在需要时使用特定的实例,并在可能有用的地方对所有实例进行迭代。

请不要引用不是真正引用的文本片段,例如最后的问题。我还强烈建议您开始遵循.NET命名约定。这是一段非常奇怪的代码,因为flyweight通常是不可变的-而您使用flyweight作为其他flyweight的工厂,这显然是不寻常的。这两段代码做的事情非常不同,但一般规则是编写清晰易懂的代码并设定性能目标。然后,一旦代码清楚地做了正确的事情(因为我们不知道规范,所以无法判断您的代码样本当前是否做了),就测量性能。只有当它不符合目标时,你才应该开始评估备选方案。我不明白你的get属性,为什么每次都要初始化一个新的flyweight对象。使用当前的代码,前一种解决方案会更快。但是您还没有实现书中所示的flyweight模式。索引器始终创建新对象(如果索引有效)。。。出于某种原因,您将flyweight类型本身与工厂相结合,没有明显的原因。我认为你应该回到书中,重新阅读对模式的描述。关键不在于它使用索引器,而是它只在需要时创建对象,并保留它们以供重用。