【问题标题】:C# Static variables - scope and persistenceC# 静态变量 - 范围和持久性
【发布时间】:2011-08-24 13:41:08
【问题描述】:

我只是做了一个小实验:

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。

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

【问题讨论】:

    标签: c# static-methods static-members


    【解决方案1】:

    它们将在AppDomain 期间持续存在。对静态变量所做的更改在方法中是可见的。

    MSDN:

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

    更多详情请参见以下内容:

    【讨论】:

    • 一个静态变量被类的所有实例共享。不只是跨方法可见。
    • c# 不支持static 局部变量。引用来自一篇关于 VB 的文章。
    【解决方案2】:

    根据Microsoft Docs: Static Classes and Static Class Members (C# Programming Guide),它们“在您的程序所在的应用程序域的生命周期内持续存在”。

    另见:

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          您在静态范围中的更改将与您的应用一样存在

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

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

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

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

              【讨论】:

              • +1 用于区分类变量和实例变量。
              • 我认为他假设myInt = 0 部分将被多次评估。
              • @Chris - 他?你确定吗? ;)
              • @YetAnotherUser 是的,克里斯是对的……他(我)确实是这样认为的。由于从不实例化静态类,我只是假设它会被使用,返回一个 int,然后程序会忘记它曾经被使用过。
              【解决方案8】:

              在程序执行期间。

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

              【讨论】:

                【解决方案9】:

                如果它是一个静态变量,这意味着它在程序运行期间只存在于内存中的一个位置。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-05-16
                  • 2013-02-15
                  • 2011-10-17
                  相关资源
                  最近更新 更多