【问题标题】:C# Are the variables inside the static methods initialized in the beginning or when the method is called first?C#静态方法中的变量是在开始时初始化还是在第一次调用方法时初始化?
【发布时间】:2012-05-25 17:43:00
【问题描述】:

在 C# 3.5 的一个类中,我有一些带有一些变量的静态方法。即使我没有初始化类,也会首先初始化静态方法。

那么静态方法中的变量是否也在开始时初始化而不是垃圾收集?

我想知道 - 即使我不调用该方法或我调用该方法一次并且该方法退出,是否会为此类方法变量分配内存?或者每次调用方法并退出时 - 方法内的变量都会被垃圾回收?

【问题讨论】:

  • 我同意 Marc Gravell 的观点,因为我是该网站的新手,因此无法为他的帖子投票。
  • @Imran 欢迎来到该网站;请注意:我们试图鼓励人们仅将答案作为“答案”发布;我已将您的答案转换为评论。您应该能够很快地添加 cmets(有一个小的代表限制,只是为了停止滥用)

标签: c# garbage-collection static-methods


【解决方案1】:

首先初始化静态方法

不,静态方法不是这样“初始化”的;它们(在标准实现中)在首次使用时被 JIT 处理,但这与内存分配无关。

那么静态方法中的变量是否也在开始时初始化而不是垃圾回收?

方法变量是每次调用(在堆栈上) - 不是全局的;堆栈空间是在您输入方法时分配的。如果您有引用类型的变量,它们将在方法退出时超出范围(假设这些变量没有“捕获”到比方法寿命更长的委托或 lambda 表达式中)。

只有 objects 被垃圾回收;不是变量。引用类型变量只是持有对对象的引用

【讨论】:

  • 谢谢马克。我明白了这个概念。问候。
【解决方案2】:

静态方法变量是在方法被调用时创建的,当方法执行结束并准备好被垃圾回收时,静态方法变量将超出范围。

【讨论】:

  • 在这里说“处置”非常具有误导性,因为它具有非常具体的含义,在这里适用
  • 是的,我改变了答案,实际上我想说他们已经准备好被垃圾收集
猜你喜欢
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
  • 1970-01-01
  • 2017-02-23
  • 1970-01-01
  • 2021-03-26
  • 2019-08-02
相关资源
最近更新 更多