C#静态变量 - 范围和持久性

Ozz*_*zah 34 c# static-methods static-members

我做了一个小实验:

public abstract class MyClass
{
  private static int myInt = 0;

  public static int Foo()
  {
    return myInt;
  }

  public static int Foo(int n)
  {
    myInt = n;
    return bar();
  }

  private static int bar()
  {
    return myInt;
  }
}
Run Code Online (Sandbox Code Playgroud)

然后我跑了:

MessageBox.Show(MyClass.Foo().ToString());
MessageBox.Show(MyClass.Foo(3).ToString());
MessageBox.Show(MyClass.Foo().ToString());
MessageBox.Show(MyClass.Foo(10).ToString());
MessageBox.Show(MyClass.Foo().ToString());
Run Code Online (Sandbox Code Playgroud)

我预期的结果是0,3,0,10,0.

令我惊讶的是,我得到了0,3,3,10,10.

这些变化持续多久了?程序执行的持续时间?调用静态方法的函数的持续时间?

Yet*_*ser 48

它们将持续AppDomain的持续时间.对方法可见对静态变量所做的更改.

MSDN:

如果使用Static关键字声明局部变量,则其生存期长于声明它的过程的执行时间.如果过程在模块内部,则只要应用程序继续运行,静态变量就会存在.

有关详细信息,请参阅以下

  • 静态变量由类的所有实例共享.不仅可以跨方法看到. (6认同)
  • c#不支持`static`局部变量.引用来自一篇关于VB的文章. (3认同)

Ed *_* S. 27

我预期的结果是0,3,0,10,0.

令我惊讶的是,我得到了0,3,3,10,10.

我不确定为什么你会期望静态变量在从Foo(int)方法中更改后恢复到其原始值.静态变量将在整个过程的生命周期中保持其值,并且每个类只存在一个,而不是实例.

  • +1 用于区分类变量和实例变量。 (2认同)

Chr*_*rle 7

如果它是一个静态变量,这意味着它在程序的持续时间内只存在于内存中的一个位置.


Ben*_*Ben 5

根据C#规范,静态变量将在不迟于第一次将类加载到AppDomain中时进行初始化,并且将一直存在,直到该AppDomain被卸载 - 通常在程序终止时.