Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建许多对象并回收它们_C#_Design Patterns - Fatal编程技术网

C# 创建许多对象并回收它们

C# 创建许多对象并回收它们,c#,design-patterns,C#,Design Patterns,我想创建一个类,该类允许我拥有许多对象并将它们存储在数据结构中。这些对象将从列表中出来,做一些事情,然后放回列表中。此循环将在程序执行期间重复多次,用于始终在此列表中的不同对象 我对两个方面非常感兴趣: 高效地创建/构建多个对象 经常使用它们 此时,对象的创建方式如下: for(int i = 0; i < NUMBER; i++) new WhitePlate(0,2,5); for(int i=0;i

我想创建一个类,该类允许我拥有许多对象并将它们存储在数据结构中。这些对象将从列表中出来,做一些事情,然后放回列表中。此循环将在程序执行期间重复多次,用于始终在此列表中的不同对象

我对两个方面非常感兴趣:

  • 高效地创建/构建多个对象
  • 经常使用它们
  • 此时,对象的创建方式如下:

    for(int i = 0; i < NUMBER; i++)
       new WhitePlate(0,2,5);
    
    for(int i=0;i
    有没有一种设计模式可以让这变得简单?我在想,从我所读到的内容来看,工厂设计模式或建设者可以做到这一点,我应该使用哪一种

    当我必须创建许多对象并将它们保存在数据结构中时,您建议我使用什么设计模式?


    我将使用的数据结构很简单,也不重要,但我将使用散列。

    您在问题中描述的是对象池。

    对象池并不是前所未有的。我在Java程序中看到过它们的使用,其目标是消除垃圾收集压力。它们通过创建一个普通的集合,用对象填充该集合,然后,您只需从集合中获取一个未使用的对象,而不是调用
    new

    这是否有助于您的特定计划是一个悬而未决的问题。您必须尝试传统方法和对象池方法,运行一些测试,看看哪种方法效果更好。不言而喻,对象池将使用更多内存,但内存使用总量的变化将小得多。

    是一种创新模式,如果您的对象单独创建成本较高,则可能会有所帮助。另一种选择是代理模式,它通过创建占位符对象(代理对象)延迟昂贵对象的创建,直到需要真正的对象;延迟加载的一个示例

    但是您说您的数据结构很简单,所以上述两种方法都不适用:即使是代理也无法避免在执行许多琐碎的内存分配时冻结UI。正如一位评论者所建议的,您可以使用延迟加载来最小化许多对象构造的影响。因此,如果启动时需要1000个对象,但速度太慢,令人无法接受,请重新设计UI,使其外观和行为与只有100个对象时一样正常。然后,您只需要在启动时构建100个对象;其余的可以稍后构建

    “以后”是什么时候?您有一些选择:

    • 随需应变。当用户操作UI时,根据需要构造对象
    • 自动但延迟的构造。这可能是在应用程序启动后第一次发出空闲信号(OnIdle事件)并且UI已完全显示时发生的。此事件在应用程序生命周期中多次引发,因此显然您需要检查第一个事件
    另一种可能性是在一个后台线程上构造所有1000个对象,允许UI线程在呈现初始UI状态时做最少的工作。但这可能只是一个选项,如果您不需要在初始阶段显示1000个对象中的任何一个


    最后,网络上有一些资源,如MSDN杂志,提供了最小化启动时间的一般指南,如只创建所需的最小表单。

    工厂创建对象。建设者建造它们。我想说,你在寻找一种更像循环缓冲区的东西。。但也许你想要的只是一个普通的列表?也许答案不是一次声明所有内容,而只是创建玩家的视图,但是如果没有更多关于你正在做什么的信息,很难说你应该查看对象池模式,因为你的编辑-我不确定你希望这样做有多容易?这看起来是一种非常直接的方法来声明一组对象。@user3626975不是非结构化的,您要求使用一种更快的方法&告诉我们您正在使用
    new
    。我只是说不存在这样的东西。如果您需要更好的性能,那么这是一个错误的位置。我还想说,任何建议设计模式的人都是在猜测,因为您列出的范围不足以证明除了调用
    new
    之外的设计模式是正确的。您指出性能是您的原因,因此我建议您可能走错了方向&建议在做出设计决策之前使用性能分析器。我想说,这绝非毫无建设性。。。