【发布时间】:2012-08-25 01:08:11
【问题描述】:
让我们举这个例子,我认为它涵盖了我所有的问题:
class SomeClass
{
static SomeType PropertyA
{
get
{
if (....)
return MethodA();
else
return MethodB();
}
}
static SomeType MethodA() { ... }
static SomeType MethodB() { ... }
}
调用 SomeClass.PropertyA 属性会造成内存泄漏吗?我的意见是不,因为属性本身没有支持字段,这会造成内存泄漏。我问这个是因为我读过静态属性会造成内存泄漏,但我认为它是负责内存泄漏的支持字段,因为它包含对实例的引用。
所以在上例中,上例中的 MethodA、MethodB 和 PropertyA 不应造成任何内存泄漏。我错了吗?
我的另一个问题是:我有很多类大多没有状态或数据。他们只是充当代理。其中一些方法被非常频繁地调用。我的问题是:我应该将这些类设为单例类、静态类还是常规类?
完美的例子是一个包含 5-10 个方法并执行一些 SQL 查询的类。
1) 如果我有它们作为常规,那么我需要经常创建它们(根据一些用户反应),调用一些方法,然后允许它们被垃圾收集。
2) 在单例和静态之间进行选择,优缺点是什么?
3) 如果我有一个包含代理方法的类,但有 2-3 个 IDbCommands,每个 IDbCommands 包含 10 个参数,并且有利于重用它们,那么在选择正确的模式时会改变什么吗?
编辑:由于我得到了一些让我更加困惑的答案,可能是由于误解,我将发布我的第一个问题的答案。我做了一个测试,我分配了一个大字节数组(300MB),它是通过PropertyA(和MethodA)检索的。 上例中的PropertyA abd MethodA 都不会持有对这个对象的引用,在获取它之后,一旦调用代码用数组完成,它就会被GC处理。因此,如果我们仅将静态属性与 getter 或静态方法一起使用,则不应存在任何内存泄漏。
【问题讨论】: