让我们举个例子,我认为它涵盖了我所有的问题:
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,每个包含 10 个参数,并且有利于重用它们,那么在选择正确的模式时会改变什么吗?
编辑:由于我得到了一些让我更加困惑的答案,可能是由于误解,我将发布我的第一个问题的答案。我做了一个测试,我分配了一个大字节数组(300MB),它是通过PropertyA(和MethodA)检索的。上例中的 PropertyA abd MethodA 都不会持有对这个对象的引用,在获取它之后,一旦调用代码完成了数组,它将被 GC 处理。因此,如果我们仅将静态属性与 getter 或静态方法一起使用,则不应存在任何内存泄漏。