我做了一个小实验:
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。
这些变化持续多久?程序执行的持续时间?调用静态方法的函数的持续时间?
答案 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)
静态变量属于类型,而不属于其实例。通常(如果您不创建多个应用程序域),类型对象只加载一次并在进程的生命周期内存在。