C# 对对象使用Indexer时是否有性能提升?
假设我必须为一个类flyweight创建三个对象,那么创建这样的对象有什么区别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 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类型本身与工厂相结合,没有明显的原因。我认为你应该回到书中,重新阅读对模式的描述。关键不在于它使用索引器,而是它只在需要时创建对象,并保留它们以供重用。