我冒着风险这可能是一个新问题,但是这里有。我很想将一个方法添加到一个类中,该类可能在给定时间内有数千个实例存储在内存中。现在,另一个选择是使用静态方法创建静态类,并在那里创建[静态]方法,而不是在类中创建实例方法。像这样:
此:
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;
}
}
我只是想知道静态类替代是否会占用更少的内存。
谢谢!
答案 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。实例方法在每个实例的基础上不需要越来越多的内存,这将是愚蠢的。
在分析代码之前,不要做出这样的设计决定。向类中添加实例方法不会导致性能瓶颈,即使它确实存在,也不应该基于猜测开始使用糟糕的设计;证明这是一个瓶颈,并根据需要进行调整。