2011-05-13 62 views
26

我只是做了一个小实验: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

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

回答

39

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

MSDN:

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

见下面的更多细节:

+5

静态变量由类的所有实例共享。不仅仅是可见的方法。 – 2013-04-28 11:04:16

5

如果它是一个静态变量,这意味着它存在于内存中只有一个地方节目的持续时间。

2

在程序执行期间。

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

26

我希望的结果是0,3,0,10,0。

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

我不知道为什么您希望静态变量在Foo(int)方法内更改后恢复为其原始值。一个静态变量将在整个生命周期中保持其值,每个类只有一个存在,而不是实例。

+1

+1用于区分类变量和实例变量。 – 2011-05-13 00:38:25

+0

我认为他假设'myInt = 0'部分将被评估多次。 – 2011-05-13 00:44:42

+0

@克里斯 - 他?你确定? ;) – YetAnotherUser 2011-05-13 00:53:42

1

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

3

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

0

你在静态范围的变化将生活作为您的应用程序

0

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