非静态类中有一个静态类。内存管理是如何发生的? [重复]

问题描述 投票:0回答:1

如果非静态类中有一个静态类,内存管理是如何发生的?

public class test { 
    public static class stringVariables {
        // inline code
    }
    // inline code
}

test
类的对象超出范围时,GC是否能够收集该对象?静态类会发生什么?除了静态减慢处理速度之外,使用这种格式还有什么问题,因为它是共享资源。

我认为创建的

test
类的第一个对象不会被销毁,除非静态类的对象被销毁。这可能会导致内存管理问题。

c# .net memory-management static garbage-collection
1个回答
1
投票

正如评论中提到的,嵌套类型本质上只是某种进一步的命名空间嵌套,它没有与实例相关的语义。所以实际上你的代码相当于这样:

namespace One
{
    public class test {     
        // inline code
    }
}
namespace One.test
{
    public static class stringVariables {
        // inline code
    }
}

这显然无法编译,因为

test
在命名空间和类名之间是不明确的。然而这是为了概念。您可以通过外部类型访问内部类型,例如

Console.WriteLine(One.test.stringVariables.MyInnerMember);

唯一的区别是,嵌套类型可以访问其包含类型中的所有静态成员。然而,有一个代码分析规则 CA1034,它会警告您有关公开可见的嵌套类型的信息。类型嵌套更多的是关于类型的逻辑结构,而不是对象实例中考虑的语义。

关于 GC,该构造与使用两个命名空间非常相似。由于这两个类没有任何共同点,因此这也适用于 GC。外部类和内部类可以完全独立地收集。当不再存在对

test
类的引用时,将收集它们的实例。然而,这当然不适用于其
static
成员,这些成员 - 与所有
statics
一样 - 在应用程序域生命周期结束时收集。

有关嵌套类型的更多信息,请参阅文档:https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/nested-types

© www.soinside.com 2019 - 2024. All rights reserved.