我是相当新的C#,但我会尽力使这个快!;)
这只是一个理论情况,但想象一下:
I)一个人有一个'ClassA',里面有'ClassB','ClassB'里面有'ClassC'.
II) ClassA有一个被调用的方法.方法本身是(不知道这个名称)用已经存在的classB变量"构造"一个新的ClassB.如下:
/*CLASS A*/ ClassA { ClassB classB; ClassA() { classB = new ClassB(); } MethodA() { classB = new ClassB(); } // Other Methods... } /*CLASS B*/ ClassB { ClassC classC; ClassB() { classC = new ClassC(); } // Methods... } /*CLASS C*/ ClassC { // Loads of variables being used... }
所以我想知道的是:
a)使用classB会在内存方面发生什么?堆中的相同空间是用于类还是会分配新空间?如果后者是这种情况,GC会以某种方式释放先前的内存吗?
b)无论上述结果是什么,classC会发生什么,加载变量篡改内存?
我们将非常感谢您直接回答或只是阅读一些简单的链接.我试图找到自己的答案,但似乎没有人解释这种荒谬的(?)情况.
在你开始理论这个问题的起源之前,我已经告诉你了.我确实把自己置于类似的情况中:
PrimaryClass
子的Class1
几个班级
子类2
几个班级
所以这个三级应用程序有时会在Sub-Class1和Sub2之间进行更改,它们都控制着"场景".这些"场景"有一些类来帮助管理(通常).这是(我的想法)无法实现的.
问题是Sub-Class1和Sub-Class 2都会占用一些内存并使用一些"资产".因此,我想擦除,是的,你听到了我,将它们从存在中删除,然后在以后再次重新创建它们.我做了一些阅读,但无法提出解决方案.(如上所述,我是C#的新手以及整个托管的.net的事情).关于这方面的任何建议都应该受到赞赏.
好吧,我写了一些比计划更多但是就是这样!期待对此有所了解!:)
问候,罗伯特
我会稍微改写一下:
ClassA() { memberB = new ClassB(); } MethodA() { memberB = new ClassB(); }
在这种情况下,memberB
持有对实例的引用classB
.
在构造函数中classA
,classB
创建了新实例(调用它instance 1
)并分配了对此实例的引用memberB
.
当您调用时methodA
,classB
会创建另一个实例,并将其引用分配给memberB
.memberB
现在指向instance 2
.instance 1
代码中不再引用,GC会在调用后立即清除它.
因此,我想擦除,是的,你听到了我,将它们从存在中删除,然后在以后再次重新创建它们.
C#的全部意义在于你不会弄乱内存.当然,您可以GC.Collect()
随时调用,但不能保证释放所有未引用的实例(尽管如实际所示).
如果要对资源进行精细控制,请使用C++/CLI实现资源需求类,继承它们IDisposable
,并在using
指令范围内调用它们.