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

时间:2011-05-13 00:31:56

标签: 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;
  }
}

然后我跑了:

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());

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

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

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

9 个答案:

答案 0 :(得分:46)

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

MSDN:

  

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

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

答案 1 :(得分:27)

  

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

     

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

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

答案 2 :(得分:7)

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

答案 3 :(得分:5)

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

答案 4 :(得分:4)

在程序执行期间。

静态类变量就像全局变量。它们没有连接到类的特定对象 - 每个程序只有一个实例。函数执行期间唯一存在的变量是函数的自动(局部)变量。

答案 5 :(得分:1)

它会持续执行程序的持续时间,或直到用另一个值覆盖它。如果你想把结果做成你想要的结果,你应该在返回myInt之前在构造函数中指定myInt = 0;

答案 6 :(得分:1)

他们在您的程序所在的应用程序域的生命周期内持续<#34; &#34;根据{{​​3}}。

另见:

答案 7 :(得分:0)

您的静态范围更改将与您的应用一样长[

]

答案 8 :(得分:0)

静态变量属于类型,而不属于其实例。通常(如果您不创建多个应用程序域),类型对象只加载一次并在进程的生命周期内存在。