C#静态vs实例方法

时间:2011-01-22 00:29:56

标签: c#

我冒着风险这可能是一个新问题,但是这里有。我很想将一个方法添加到一个类中,该类可能在给定时间内有数千个实例存储在内存中。现在,另一个选择是使用静态方法创建静态类,并在那里创建[静态]方法,而不是在类中创建实例方法。像这样:

此:

public static class PetOwner
{
    public static void RenamePet(Pet pet, string newName)
    {
        pet.Name = newName;
    }
}

而不是:

public class Pet
{
    public string Name { get; set; }

    public void Rename(string newName)
    {
        this.Name = newName;
    }
}

我只是想知道静态类替代是否会占用更少的内存。

谢谢!

8 个答案:

答案 0 :(得分:30)

只有数据字段需要按实例存储,具体取决于某些条件和优化。例如,定义Int32成员的10,000个类实例将占用约40,000字节的内存。

另一方面,由于实习,弦乐并不那么简单。你可以试试这个例子:

object.ReferenceEquals("", string.Empty) // returns true!

如果相同的10,000个实例也定义了一个字符串,并且该字符串对于每个实例都是相同的,那么您将有10,000个引用指向相同的数据,从而大大降低了开销(但在32位环境中,引用占用了另外40,000个字节。

其他人指出的方法,无论是静态还是实例,只加载一次。

使用实例或静态方法的决定不受性能原因的影响,而是受如何使用该方法的影响。在您的情况下,该方法需要将类型的实例作为其第一个参数,因此它也可以是实例方法。

根据我的经验,静态方法作为返回新实例的类型构造函数的替代方法最有用。一旦被调用,构造函数必须返回一个新实例或抛出异常,这可能是不可取的。如果某些内容失败,静态方法可以返回null,或者返回一个缓存的实例(如果构造函数是一个昂贵的操作,后者很有用)。

答案 1 :(得分:16)

方法只在内存中存在一次,无论它们是否为静态,因此在内存使用方面没有任何区别。

答案 2 :(得分:3)

除了Guffa的回答:

  

方法只在内存中存在一次,   无论它们是否静止,   所以没有任何区别   内存使用情况。

实例方法有一个类实例作为不可见(可以通过this)参数传递给它,实质上是将void Rename(string newName)的newName作为第二个参数传递给你的实例方法;因此,static void RenamePet(Pet pet, string newName)void Rename(string newName)生成的烧录说明看起来基本相同,因此它们在性能上没有任何差异

答案 3 :(得分:2)

它没有什么区别,方法(静态或实例)只被加载到内存和JIted中,它们不会因为它们是实例方法而消耗更多内存。

答案 4 :(得分:1)

类的实例数量不会影响方法使用的内存量。

答案 5 :(得分:0)

关于内存静态和实例方法是相同的,除了实例方法可以包含数据成员,其中静态方法只能有静态数据成员。

答案 6 :(得分:0)

在内存情况下它没有任何区别,方法在内存中只存在一次,无论是静态还是实例,但静态方法调用的速度比实例方法快一些,因为实例方法实际上使用'this'实例指针作为第一个参数,因此实例方法将始终具有该开销

因此,在性能方面,静态方法与实例方法相比没什么优势,但对于内存使用,它们都使用相同的数量。

答案 7 :(得分:-2)

根本不需要“重命名”方法;你已经有了一个,它是Name属性的setter。实例方法在每个实例的基础上不需要越来越多的内存,这将是愚蠢的。

在分析代码之前,不要做出这样的设计决定。向类中添加实例方法不会导致性能瓶颈,即使它确实存在,也不应该基于猜测开始使用糟糕的设计;证明这是一个瓶颈,并根据需要进行调整。