Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.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# 4.0 静态属性/方法内存分配_C# 4.0_Static_Singleton - Fatal编程技术网

C# 4.0 静态属性/方法内存分配

C# 4.0 静态属性/方法内存分配,c#-4.0,static,singleton,C# 4.0,Static,Singleton,让我们以这个例子为例,我认为它涵盖了我所有的问题: class SomeClass { static SomeType PropertyA { get { if (....) return MethodA(); else return MethodB(); } } static SomeType Meth

让我们以这个例子为例,我认为它涵盖了我所有的问题:

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个IDB命令,每个命令包含10个参数,并且有利于重用它们,那么在选择正确的模式时会有什么变化吗

编辑:因为我得到了一些更让我困惑的答案,可能是因为误解,我将发布我第一个问题的答案。我做了一个测试,分配了一个大字节数组(300MB),通过PropertyA(和MethodA)检索上述示例中的两个属性a和方法a在获取该对象后将不会持有对此对象的引用,因此只要使用数组调用代码,它将由GC处理。所以,如果我们只对getter使用静态属性,或者使用静态方法,就不应该有任何内存泄漏

所以在上面的示例中,上面示例中的MethodA、MethodB和PropertyA不应该产生任何内存泄漏。我错了吗

如果你的意思是他们不会创建或保留任何内存,那么这是真的-属性本身不会保留内存

静态字段不会创建“内存泄漏”-该类型的类型初始值设定项将在首次使用该类之前运行,如果字段需要内存,则将为该字段分配内存。这个内存没有被清除——如果这就是你所说的“泄漏”的意思的话——但是没有可以释放的实例,所以这是预期和期望的行为

所以在上面的示例中,上面示例中的MethodA、MethodB和PropertyA不应该产生任何内存泄漏。我错了吗

如果你的意思是他们不会创建或保留任何内存,那么这是真的-属性本身不会保留内存


静态字段不会创建“内存泄漏”-该类型的类型初始值设定项将在首次使用该类之前运行,如果字段需要内存,则将为该字段分配内存。这个内存没有被清除——如果这就是你所说的“泄漏”的意思的话——但是没有可以释放的实例,因此这是预期的和期望的行为。

简单的答案是一个问题:“除了简单的垃圾收集外,这些方法做什么,它们保持状态,它们是否需要清理?”

如果他们不遵守以上所有规定,你就不会有漏洞。只有在你不采取措施的情况下才会发生泄漏,如果你不采取任何措施,那么你就没有泄漏

如今,与其说是泄漏,不如说是“内存压力”

一般来说,我倾向于使用实例方法,因为它提供了垃圾收集,并允许更容易地模拟和测试场景


静态方法和变量与实例变量和方法面临相同的问题,因此如果可能,泄漏适用于两者

简单的答案是一个问题:“除了简单的垃圾收集之外,这些方法做什么,它们保持状态,它们是否需要清理?”

如果他们不遵守以上所有规定,你就不会有漏洞。只有在你不采取措施的情况下才会发生泄漏,如果你不采取任何措施,那么你就没有泄漏

如今,与其说是泄漏,不如说是“内存压力”

一般来说,我倾向于使用实例方法,因为它提供了垃圾收集,并允许更容易地模拟和测试场景


静态方法和变量与实例变量和方法面临相同的问题,因此如果可能,泄漏适用于两者

我已经更新了这个问题来解释我所说的内存泄漏是什么意思。当您说“如果一个字段需要内存,那么该字段的内存将被分配”时,这是否意味着SomeProperty将不包含对SomeClass的引用(在我的第一个示例中)?@Goran是的,当然,如果“MethodA”或“MethodB”不返回null。但是,是的,该字段将保存对实例的引用,这将防止该引用被垃圾收集。因此,这是一个内存泄漏,这意味着我输入的上述代码是错误的代码,永远不应该使用。对PropertyA的调用每次返回不同的实例。这意味着,当调用代码完成对SomeClass实例的使用时,将永远不会收集该实例(PropertyA对它有引用),但同时该对象不再可访问,因为调用PropertyA getter将返回对SomeClass新实例的引用。这是否也适用于静态方法,在我的示例中,是否会有3个对某个类型实例的引用:调用代码、PropertyA和MethodA?我已经更新了这个问题,以解释我所说的内存泄漏是什么意思。当您说“如果一个字段需要内存,那么该字段的内存将被分配”时,这是否意味着SomeProperty将不包含对SomeClass的引用