可变和垃圾回收的寿命

时间:2018-09-28 07:26:12

标签: c# scope garbage-collection

我最近开始学习C#,并创建了一个基本程序,该程序禁止一个类代表公司,另一个类代表员工。 Company类包含一种雇用Employee的方法(基本上,添加到Employee的列表中)。

这是Company的代码:

using System;
using System.Collections.Generic;

namespace tutorial {
    static public class Company {
        static public List<Employee> employees = new List<Employee>();

        static public void Hire (Employee emp) {
            employees.Add(emp);
        }

        static public void ListEmployees () {
            foreach (Employee emp in employees) {
                Console.WriteLine(emp);
            }
        }
    }
}

这是主程序:

using System;

namespace tutorial {
    class Program {
        static void Main(string[] args) {
            Console.WriteLine("Hello World!");
            Company.Hire(new Employee("John", "Smith", DateTime.Now));
            Company.Hire(new Employee("Jane", "Smith", DateTime.Now));
            Company.ListEmployees();
        }
    }
}

然后,我的问题是:何时可以删除/收集创建的Employee

C#类的负责人告诉我,一旦Hire方法返回,这种情况可能会发生。这意味着ListEmployees可能会读取一个空列表。

但是,ListEmployees可以正常工作。而且,我的理解是使用引用计数,因此只要存在Employee静态类(即,只要程序正在运行),就不会删除Company。 / p>

谁能告诉我这里的内存管理如何工作?我对引用计数的理解错了吗?

1 个答案:

答案 0 :(得分:0)

来自微软的documentation

  

当垃圾收集器执行收集时,它会检查托管堆中应用程序不再使用的对象,并执行必要的操作以回收其内存。

要回答您的问题,Employees将在应用程序停止时被垃圾回收,因为您的类被声明为static。但是,如果您从类而不是从字段中删除静态对象,则您的字段仍将具有与应用程序相同的寿命。您不仅需要从类中删除静态对象,还需要从字段本身中删除静态对象。

Microsoft在后台实施static关键字Microsoft使用Singleton pattern。因此,只要您的应用程序正在运行,就可以使您的课程保持活动状态。

如果您希望避免这种情况,可以在这种情况下使类变为非静态,当不再使用Employees类的实例时,将Company进行垃圾回收。即

class Program
{
    static void Main(string[] args)
    {
        Company comp = new Company();

        //Somecode
    }

}
class Company
{
    public List<Employee> employees = new List<Employee>();

    public void Hire(Employee emp)
    {
        employees.Add(emp);
    }

    public void ListEmployees()
    {
        foreach (Employee emp in employees)
        {
            Console.WriteLine(emp);
        }
    }
}

在上面的示例中,当调用Main方法时,它将创建Company类的实例,并且该实例的生存期是Main方法的范围。方法退出后,comp变量将有资格进行垃圾回收。

我建议您阅读GC(垃圾收集)的整个文档,因为Microsoft已经很好地解释了工作原理。