c# - 静态方法总是保存在内存中吗?

标签 c# static

我的整个开发团队都认为,静态方法使用起来很糟糕。

在某些情况下,我真的看不出有什么缺点。当我以前需要无状态方法时,我总是为此目的使用静态方法。

我同意他们的一些观点,例如我知道它们很难测试(尽管并非不可能)。

我不明白的是,他们声称,静态方法始终保存在内存中,并将填充基本内存使用量。所以,如果你在你的程序中使用了 100 个静态方法,当程序启动时所有的方法都被加载到内存中并且会不必要地填满内存。此外,静态方法会增加内存泄漏的风险。

这是真的吗?

只为调用方法而必须创建类的新实例是非常不方便的。但他们现在就是这样做的,在方法中间创建一个实例并调用该方法,这可能只是一个静态方法。

最佳答案

就内存而言,静态方法和实例方法没有区别。实例方法只有一个额外的参数,this。其他一切都完全相同。此外,扩展方法很容易添加到 C# 的基本方法,所需要的只是公开隐藏的 this 参数的语法。

方法为其机器代码占用空间,即处理器执行的实际代码。以及一个描述该方法如何存储对象的表,帮助垃圾收集器发现保存在局部变量和 CPU 寄存器中的对象根。该空间取自“加载程序堆”,这是 CLR 创建的与 AppDomain 关联的内部数据结构。只发生一次,当方法第一次执行时,及时。释放该空间需要卸载该应用程序域。静态变量也分配在加载程序堆中。

不要丢掉静态方法的巨大优势。它们可以大大提高代码的可读性和可维护性。由于他们的契约(Contract),他们不能改变对象状态。因此,它们的副作用很少,因此很容易推断出它们的作用。但是,如果它们让您添加静态变量,那么它们的作用恰恰相反,全局变量是邪恶的。

关于c# - 静态方法总是保存在内存中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34149386/

相关文章:

c# - 通用 Windows .NET Native 和 winmd 组件库

c# - 是什么污染了这个 switch 语句?

gwt - 简单的 GWT 托管

performance - 在 Julia 中,是否有宏来确定是否可以在解析时评估表达式?

c# - 在 WINRT 应用程序中使用转换器

c# - HiddenFor 应该尊重 DisplayFormat 吗?

c# - 使用 Asp.NetCore TestServer 托管的 WebAPI 的 HttpClient 连接问题

Java 静态 - 方法或字段?

c++ - 使用公共(public)静态常量类成员的声明

c++ - C++中的静态变量声明和定义