C#静态vs实例方法

Car*_*rlo 21 c#

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

这个:

public static class PetOwner
{
    public static void RenamePet(Pet pet, string newName)
    {
        pet.Name = newName;
    }
}
Run Code Online (Sandbox Code Playgroud)

而不是这个:

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

    public void Rename(string newName)
    {
        this.Name = newName;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Qui*_*ith 31

根据特定条件和优化,只有数据字段需要按实例存储.例如,定义Int32成员的10,000个类实例将占用约40,000字节的内存.

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

object.ReferenceEquals("", string.Empty) // returns true!
Run Code Online (Sandbox Code Playgroud)

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

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

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

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


Guf*_*ffa 16

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

  • 事实上,所有方法调用都有效地表现得像静态调用.细节只是隐藏在幕后. (3认同)

Mic*_*uen 5

除了古法的回答:

方法在内存中只存在一次,不管它们是否是静态的,所以在内存使用上根本没有区别。

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