C# 关于内存大小,清理对象

C# 关于内存大小,清理对象,c#,C#,考虑下面的一个例子 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 {

考虑下面的一个例子

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类
{
int x;
}
甲级
{
INTA;
int b;
B b1=新的B();
void testMethod()
{
对于(int i=1;i<10;i++)
b1=新的B();
}
}
类MainClass//将永远不会关闭此应用程序
{
静态void Main(对象[]参数)
{
a1=新的A();
a1.testMethod();
}
}
在上面的例子中,我每次在循环中创建一个新的B类对象。所以这里我的问题是,当我给b1分配一个新的对象时,前一个对象会发生什么,它会被清理,还是会保留在内存中


如果没有清理和增加内存,如何清理

每次执行此操作时:
b1=new B()
,您将为
b1
分配一个新对象的新引用(
b1
不是a),因此,以前的引用现在未使用,因此垃圾收集器将对其进行处理


总结:不是在增加内存,因为每次这样做时它都是a:
b1=new B()
,您将为
b1
分配一个新对象的新引用(
b1
不是a),因此,以前的引用现在未使用,因此垃圾收集器将对其进行处理


总结:不是增加内存,因为每次创建
B

b1 = new B();
存储在
b1
中的原始对象变得不可访问。这意味着它有资格进行垃圾收集。这并不意味着它将立即从内存中清除

符合GC条件的对象将在“将来某个时候”实际进行GC。我们不知道也不需要知道确切的时间。只要相信GC


换句话说,在运行
testMethod
之后,
B
的9个对象将符合GC条件或已被收集,而第十个对象将在每次创建
B
的新对象时保持存储在变量
b1

b1 = new B();
存储在
b1
中的原始对象变得不可访问。这意味着它有资格进行垃圾收集。这并不意味着它将立即从内存中清除

符合GC条件的对象将在“将来某个时候”实际进行GC。我们不知道也不需要知道确切的时间。只要相信GC


换句话说,在运行
testMethod
之后,
B
的9个对象将符合GC条件或已被收集,尽管第十个对象仍将存储在变量
b1
中,但任何值类型和引用类型的寿命取决于用于定义它的访问说明符和该功能的范围。功能可以是定义对象的任何类、函数或循环

在您的例子中,您定义了引用类型
b1=new B()
,没有任何访问说明符(默认访问说明符),因此它将被视为。外部世界无法访问内部定义的变量

b1
的范围仅限于定义代码的for循环

for (int i = 1; i < 10; i++)
            b1 = new B();
for(int i=1;i<10;i++)
b1=新的B();

如果您注意到以上两个条件,您将了解在for循环的每次迭代后,对象
b1
被处置

任何值类型和引用类型的寿命取决于用于定义它的访问说明符和该功能的范围。功能可以是定义对象的任何类、函数或循环

在您的例子中,您定义了引用类型
b1=new B()
,没有任何访问说明符(默认访问说明符),因此它将被视为。外部世界无法访问内部定义的变量

b1
的范围仅限于定义代码的for循环

for (int i = 1; i < 10; i++)
            b1 = new B();
for(int i=1;i<10;i++)
b1=新的B();

如果你注意到以上两个条件,您将了解,对象
b1
在for循环的每次迭代后被处置

它将被垃圾收集,因为上一个对象不再被引用。它将被垃圾收集,因为上一个对象不再被引用。如果在for循环之后我又有一个使用b1的语句呢b1.Dosomthing();如果我理解正确的话,答案是b1将在A类结束时由垃圾收集器处理。为了演示我尝试过的示例,请查看它。示例:如果在for循环之后,我又有一个使用b1.Dosomthing()的语句,该怎么办;如果我理解正确的话,答案是b1将在A类结束时由垃圾收集器处理。为了演示我尝试过的示例,请查看它。例子: