c# - 在非静态方法中使用静态成员会导致内存泄漏吗?

标签 c# memory-leaks static

DoSomething() 方法会导致内存泄漏吗?

public static class AppContext
{
   public static int ApplicationStateId {get; set} 
   ...
} 
public class MyService
{
     public void DoSomething()
     {
        ....
        if(AppContext.ApplicationStateId == 1) 
        {
             //do something
        } 
     }
}

var service = new MyService();
service.DoSomething();

This means that static variables and everything they reference will never be garbage collected.

Michael 在 8 Ways You can Cause Memory Leaks in .NET 中说.

最佳答案

这里没有“泄漏”;这只是预期的行为。是的,任何可通过静态字段访问的内容都不会被 GC 收集,但就某种全局状态而言,这通常是正确的。对于“泄漏”,我们通常指的是意外或无法解释的内存保留。最常见的情况是使用静态事件,这听起来是个好主意,但可以很容易地让长期冗余对象的整个片段保持事件状态。例如:

SomeType.SomeStaticEvent += obj.HandleTheThing;

现在意味着 obj 中的对象现在被永久保留(或者至少直到委托(delegate)被明确地从事件中删除),以及 obj 可以看到的任何东西: 现在永久保留,等等。


在问题中显示的情况下,没有甚至任何对象 - 只有一个整数。我认为您无需担心在应用域的持续时间内保留整数的成本,特别是如果您的应用域要求在持续时间内知道该整数。

我会更关心诸如并发性之类的事情——这是否意味着“多个当前用户站”,或者低级别的细节,比如波动性和字段的寄存器使用。

关于c# - 在非静态方法中使用静态成员会导致内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62892812/

相关文章:

c# - 将指针转换为 float

powershell - Import-PSSession-内存泄漏

delphi - 嵌套匿名方法发生内存泄漏

.net - 如何正确使用实现 IDisposable 的静态属性?

Java:非静态变量 this 不能从静态上下文中引用

c# - 处理 asp.net 数据源异常

c# - 首次成功调试后 Visual Studio 2015 无法工作

c# - 可移植类库中的 Type.IsEnum 属性

c - 程序运行后退出?

c# - 一些静态类问题