如果非静态类中有一个静态类,内存管理是如何发生的?
public class test {
public static class stringVariables {
// inline code
}
// inline code
}
当
test
类的对象超出范围时,GC是否能够收集该对象?静态类会发生什么?除了静态减慢处理速度之外,使用这种格式还有什么问题,因为它是共享资源。
我认为创建的
test
类的第一个对象不会被销毁,除非静态类的对象被销毁。这可能会导致内存管理问题。
正如评论中提到的,嵌套类型本质上只是某种进一步的命名空间嵌套,它没有与实例相关的语义。所以实际上你的代码相当于这样:
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