【问题标题】:what is the life time of static variable in C#.netC#.net 中静态变量的生命周期是多少
【发布时间】:2019-01-30 18:28:40
【问题描述】:

我创建了一个控制台应用程序,我在任务计划程序中将其安排为作业。我的应用程序中有一个类级别的静态变量,下面是示例代码。当我的工作第一次运行时,没问题。当我立即重新运行作业时,我收到“对象引用”错误,因为我在 finally 块中将其设置为 NULL 并在 try 块中执行“sb.clear()” - 静态变量将只初始化一次。

Class Temp
{
   public static StringBuilder sb = new StringBuilder();
   try
   {
       sb.clear();
       ... some code
   }
   catch
   {}
   finally
   {
      sb = null
   }
}

我的任务计划程序作业将每 24 小时运行一次。由于我将变量设置为 NULL,这是否会在第一次运行一段时间后被收集起来?这样,当我的作业在 24 小时后第二次运行时,我不会遇到“对象引用”错误(考虑将再次创建静态变量)。

如果我将其设置为 NULL,我想知道静态变量的生命周期是多少,否则我将其设置为 NULL。请澄清。

【问题讨论】:

  • 如果这个对象只存在于特定方法的上下文中,每隔一段时间运行一次,那么它不应该存储在静态变量中。它的范围应限于需要它的特定操作。这可以防止您需要知道何时可以使用和不能使用给定变量,并创建错误,就像您显然拥有的错误一样,这些错误涉及在不应该使用变量时使用。如果您在需要时创建它,并在操作完成时让该变量离开范围您就不会出现这样的错误。 GC 不是您的优先事项,工作代码才是。

标签: c# .net


【解决方案1】:

静态变量的生命周期与您的应用程序运行时间一样长。 在此处查看更多详细信息:

Scope and persistence Lifetime of data in variable static

希望这些信息对你有用

【讨论】:

  • 如果我将 NULL 分配给变量,它不会准备好在 GC 循环期间进行垃圾收集。请指教。
  • 变量不是 GC 过程的主题 - 对象是。如果将 NULL 分配给变量,则只需删除对存在于堆中某处的对象的引用。只有在程序的其他任何地方都没有引用该对象时,GC 才会收集该对象。
【解决方案2】:

sb.clear(); //this 不能用于 null stringBuilder 在这种情况下,Finally 将您的 sb 变量设置为 null。 所以不要使用 finally

【讨论】:

  • 我知道,这就是问题所在。分配 NULL 不会让它在 GC 循环期间收集垃圾?请指教。
猜你喜欢
  • 2010-09-19
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
相关资源
最近更新 更多