【问题标题】:How does c# handle the memory for static membersc#如何处理静态成员的内存
【发布时间】:2016-12-21 19:15:55
【问题描述】:

进行了很多搜索,但最终都没有澄清我的疑问。

当使用静态类或方法时,c# 何时为它们分配内存?它会被释放吗?

额外问题:什么时候应该使用静态成员或类?

【问题讨论】:

  • 第一次使用该类。它不会被释放。
  • 关于额外问题:在需要时使用静态成员或类。
  • 它很可能在编译时分配内存。但这实际上是一个实现细节,而不是您需要担心的事情。你想解决什么问题?为什么这很重要?
  • @CodyGray 编译该程序时无法为该程序分配内存...
  • 当然可以,@servy。信息放置在二进制图像的静态数据区域(.data/.bss 部分)。该分配发生在编译时。与链接器合作的编译器为该数据分配空间并知道其地址是什么。我不知道您是否试图指出二进制图像在加载时必须映射到内存中,所以实际上是加载器执行分配?虽然这肯定是一个有效的观点,但运行时也不会分配动态内存是真的:OS VMM 会。

标签: c# memory-management static-methods static-classes


【解决方案1】:

https://msdn.microsoft.com/en-us/library/79b3xss3.aspx

与所有类类型一样,当加载引用该类的程序时,.NET Framework 公共语言运行时 (CLR) 会加载静态类的类型信息。程序无法准确指定加载类的时间。但是,它保证在程序中第一次引用该类之前被加载并初始化其字段并调用其静态构造函数。静态构造函数只被调用一次,静态类在程序所在的应用程序域的整个生命周期内都保留在内存中。

【讨论】:

    【解决方案2】:

    当使用静态类或方法时,c# 何时为它们分配内存?

    分配内存的不是 C#,而是底层的 CLR。您还应该区分内存的分配和成员的实际初始化

    内存的分配可以在程序(EXE、DLL)被加载到内存时发生。这是因为在“典型”实现中,静态数据成员被分配在所谓的data 段上。这是专门用于保存永久(从运行时角度)数据结构的内存的固定部分。然而,一个特定的实现可能会有点不同,即使它必须是某种静态的data 段,至少包含指向其他数据结构的指针。

    初始化发生在第一次访问类之前。

    它会被释放吗?

    没有。它们是静态的。


    额外问题:什么时候应该使用静态成员或类?

    旁注:这不是一个额外的问题,而是一个主要基于意见关闭问题的原因。

    【讨论】:

    • 谢谢 Ondrej!对我帮助很大。
    猜你喜欢
    • 1970-01-01
    • 2013-09-30
    • 2012-03-14
    • 2023-04-01
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多