小对象:经常创建还是重用?

时间:2011-08-18 18:15:16

标签: c# object

例如,在draw方法中,我需要使用一个Rectangle实例。像这样:

Rectangle rect = new Rectangle(FrameSize * CurrentFrame, 0, FrameSize, FrameSize);

或其他方式。定义临时矩形数据成员,然后像这样使用它:

rect.X = FrameSize * CurrentFrame;
rect.Y = 0;
rect.Width = FrameSize;
rect.Height = FrameSize;

哪种方式更好?有一点让我感到困惑的是,许多矩形频繁创建,但许多代码解决方案使用第一种方法,而第二种方法应该注意内存消耗。

6 个答案:

答案 0 :(得分:3)

在大多数情况下,我会亲自使用第一种方法 - 理想情况下,如果类型是有意义的,并且类型是在您的控制之下,则使该类型不可变。

垃圾收集器非常善于回收短期对象 - 并且创建新对象意味着您不必担心某些是否仍然具有对旧对象的引用(从而进行更改)这是一个问题)。

答案 1 :(得分:3)

除非您通过仔细测量证明重用可以提高性能,否则每次都应该创建一个新对象。

.NET处理对象创建和GC非常有效,你不必担心这里有任何性能损失。第二个解决方案需要更仔细的编码,以确保您不会重复使用其他地方使用的对象,并且您没有以前的状态拖延。此外,您将在GC中将更多对象老化到gen1或gen2中。

答案 2 :(得分:2)

物体有多久了?如果它们只是在本地创建然后由绘图方法使用,那么它们很可能会收集到零代,这是相当有效的。

重新使用临时矩形的问题在于,如果你试图让它在方法的生命周期之外徘徊,那么一般来说修改会有问题。

作为一般规则,我会选择#1,如果您在分析#1成为问题后稍后发现,则只考虑#2。

答案 3 :(得分:1)

前者在可能的错误方面更安全,就Rectangle类而言,可变性会产生一些奇怪且难以发现的效果。

我不认为性能损失严重到足以冒险在可变结构的野外冒险。

答案 4 :(得分:0)

考虑结构在堆栈上分配的事实,在绘制方法的情况下我个人会选择第一种方法,如

  1. 对象已创建并初始化

  2. 用于

  3. 离开功能时推送到GC。

  4. 因此,这是一个快速创建并快速从内存中删除的小对象。

答案 5 :(得分:0)

我会在实例的基础上做到这一点。重复使用它并没有获得太多收益,它使您的代码更容易破解。通过在实例的基础上执行此操作,您可以将某些逻辑封装在方法中,并且您不必担心由于方法之外的因素而导致其中断。