我最近开始学习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>
谁能告诉我这里的内存管理如何工作?我对引用计数的理解错了吗?
答案 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已经很好地解释了工作原理。