C# 从列表中删除对象时的资源管理

C# 从列表中删除对象时的资源管理,c#,resources,C#,Resources,我试图理解当使用List.Add(新对象)和稍后的List.Remove实例化对象时,对象实例会发生什么 我的问题是-如果我创建了一个对象的实例,并且它的唯一引用在该列表中。从列表中删除该项时会发生什么情况?我已经失去了我对它的任何引用,因为它已经不在列表中了。这是否意味着它已经从记忆中消失了 下面的例子只是为了说明我的问题……我知道这可能不是他们制作电子游戏的方式,而是我如何用一种非抽象的方式来展示我的问题 class Enemy { public string name { get;

我试图理解当使用List.Add(新对象)和稍后的List.Remove实例化对象时,对象实例会发生什么

我的问题是-如果我创建了一个对象的实例,并且它的唯一引用在该列表中。从列表中删除该项时会发生什么情况?我已经失去了我对它的任何引用,因为它已经不在列表中了。这是否意味着它已经从记忆中消失了

下面的例子只是为了说明我的问题……我知道这可能不是他们制作电子游戏的方式,而是我如何用一种非抽象的方式来展示我的问题

class Enemy
{
    public string name { get; set; }
    public int level { get; set; }
    public int currentHP { get; set; }

    public Enemy(string name, int lvl, int HP)
    {
        this.name = name;
        this.level = lvl;
        this.currentHP = HP;
    }
}
class Program
{
    static void Main(string[] args)
    {
        //game starts
        List<Enemy> enemyList = new List<Enemy>();
        enemyList.Add(new Enemy("First enemy", 1, 150));
        enemyList.Add(new Enemy("Second enemy", 1, 150));
        enemyList.Add(new Enemy("Third enemy", 1, 150));

        //enemy 2 dies
        enemyList.RemoveAt(1);

        //some time passes
        //new enemy spawns
        enemyList.Add(new Enemy("Forth enemy", 1, 150));

        //game continues......
    }
}
类敌人
{
公共字符串名称{get;set;}
公共整数级别{get;set;}
public int currentHP{get;set;}
公敌(字串名称,单位等级,单位生命)
{
this.name=名称;
这个水平=lvl;
此.currentHP=HP;
}
}
班级计划
{
静态void Main(字符串[]参数)
{
//比赛开始了
List enemyList=新列表();
enemyList.Add(新敌人(“第一敌人”,1150));
enemyList.Add(新敌人(“第二敌人”,1150));
enemyList.Add(新敌人(“第三个敌人”,1150));
//敌人2号死亡
enemyList.RemoveAt(1);
//一段时间过去了
//新的敌人诞生
enemyList.Add(新敌人(“第四敌人”,1150));
//游戏继续。。。。。。
}
}

是,如果从列表中删除in项,则会丢失对该项的引用,并且无法再访问该项。它会一直保留在内存中,直到GC在下次运行时收集它,但是您无法访问它

事实上,如果您知道它的确切内存地址,您可以使用硬件级内存访问功能来访问它。然而,这是一项非常重要的任务,仅在一些安全黑客中使用(通常通过执行内存转储来查找最后使用的密码)。这不是你可以考虑在自己的程序中使用的东西。 如果要将其从列表中删除,但将来仍要访问它,可以保存对它的引用。例如:

var deadEnemies = new List<Enemy>();
deadEnemies.Add(enemyList.Item[1]);
enemyList.RemoveAt(1);
var=new List();
添加(enemyList.Item[1]);
enemyList.RemoveAt(1);