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

我做了一个小实验:

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。

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

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

MSDN:

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

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

  • MSDN:静态变量
  • MSDN:可变生命周期

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

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

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

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

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

在程序执行期间。

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

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

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

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

根据Microsoft Docs:静态类和静态类成员(C#编程指南) ,它们“在程序所在的应用程序域的生命周期内 ”持续存在。

也可以看看:

  • Microsoft Docs:应用程序域

  • .NET API浏览器:AppDomain类