考虑一个示例如下
class B
{
int x;
}
class A
{
int a;
int b;
B b1 = new B();
void testMethod()
{
for (int i = 1; i < 10; i++)
b1 = new B();
}
}
class MainClass //Will never close this application
{
static void Main(object[] args)
{
A a1 = new A();
a1.testMethod();
}
}
在上面的示例中,每次在循环中每次创建一个新的B类对象。因此,在这里我的问题是,当我将新对象分配给B1时,将要清理的先前对象会发生什么,否则它将保持内存。
如果它没有清理并增加内存,如何清理?
每次创建B
b1 = new B();
b1
中存储的原始对象变得无法访问。这意味着它有资格获得垃圾收集。这确实不是意味着它将立即从内存中清除!
有资格获得GC的对象实际上将在"将来的某个时间"。我们不知道,也不需要知道什么时间。只需相信GC。
换句话说,运行testMethod
之后,B
的9个对象将符合GC的资格或已收集,而第十个对象将保留在变量b1
中。
每次执行此操作: b1= new B();
,您正在分配给b1
对新对象的新引用( b1
是不是 valueType),因此,上一个现在,参考文献是未使用的,因此,垃圾收集器将处置它。
总结:没有增加内存,因为它是托管资源
任何值类型和参考类型的寿命取决于用于定义它的访问说明符以及该功能的范围。功能可以是您定义对象的任何类,功能或循环。
在您的情况下,您定义了带有任何访问说明符(默认访问说明符)的参考类型B b1 = new B()
,因此将其视为内部。内部定义的变量无法访问外部世界。
b1
的范围仅限于您定义代码的循环。
for (int i = 1; i < 10; i++)
b1 = new B();
如果您在两个条件上注意到,您会理解对象b1
在每次迭代for for for for for for for for for for for for for for for for for 中。