C# 在Unity 3D中,是否有一般规则来理解何时引用变量以及何时将其复制到新变量?

C# 在Unity 3D中,是否有一般规则来理解何时引用变量以及何时将其复制到新变量?,c#,unity3d,C#,Unity3d,例如,如果我有敌人,并且每个敌人都有一个保持点数的类。然后,当一个敌人诞生时,它连接到PointsKeeper.Instance,并将自己添加到列表点 有没有一种简单的方法可以知道我添加到列表中的EnemyPoints是对原件的引用还是副本的引用 示例代码: private List<EnemyPoints> points; public void AddEnemy(EnemyPoints enemy) { points.Add(enemy); } public void

例如,如果我有敌人,并且每个敌人都有一个保持点数的类。然后,当一个敌人诞生时,它连接到
PointsKeeper.Instance
,并将自己添加到
列表点

有没有一种简单的方法可以知道我添加到列表中的
EnemyPoints
是对原件的引用还是副本的引用

示例代码:

private List<EnemyPoints> points;

public void AddEnemy(EnemyPoints enemy)
{
    points.Add(enemy);
}

public void AddPoint(int enemy)
{
    points[enemy].points++;
}
私有列表点;
公共虚增敌人(敌人的敌人)
{
点数。添加(敌人);
}
公共无效添加点(int敌人)
{
点数[敌人]。点数++;
}
C#是一种传递值语言。因此,当您将变量传递给方法时,它总是传递值,而不是引用

因此,在第二种方法中:

public void AddPoint(int enemy)
{
points[enemy].points++;
}
您的
int敌人
实际上将包含您想要传递的int值

让事情变得更复杂的是,在第一种方法中,你传递了一个对象:

public void AddEnemy(EnemyPoints enemy)
{
points.Add(enemy);
}
这次,您的
EnemyPoints
变量不包含整个对象,而是实例的内存地址。实际上,您正在传递一个值,但该值是对对象实例的引用。因此,最终您实际上是在传递一个引用

事实上,c#docs中的数据类型分为值类型和引用类型。前者保存类型的实际值,后者保存引用


你可以检查一下,它的统一性和C#的整体性是一样的。对我来说,问题真的变成了,你有一个问题,你不确定你是否在处理原始引用吗?@Charleh所以说敌人有一个健康脚本,它死了,并且在它的兄弟脚本中运行
点--
。这是否也会改变
列表点
中的
PointsKeeper.Instance
?不,int是一个值类型,除非您通过引用显式传递它,否则您总是引用该值的副本。正如我为@Charleh所评论的:假设敌人有一个健康脚本,它就会死亡,它在其同级脚本中运行
点--
。这是否也会在
PointsKeeper.Instance
中的
列表点中更改它?从您的回答听起来,它将传递引用,是的,运行状况脚本将更改
EnemyPoints
脚本和
PointsKeeper中的值。Instance
yes,该列表包含实际引用对象的值。因此,如果通过列表访问对象,则访问修改的对象。顺便说一句,如果游戏对象在敌人死亡时被摧毁,它在列表中的位置不会被删除,但它的值实际上是
null
。由您决定是否将其从列表中删除。我将通过您发送的Microsoft链接进行查看:)您对空引用的看法是正确的,我知道这一点,但也许它可以帮助其他人!我很高兴我帮了忙。如果您觉得我的答案足够全面,请随意将其标记为已接受的答案!:)好的,如果你访问列表元素,然后对它进行变异,是的,如果它是同一个列表实例,是的,但是如果你把这些值中的任何一个放入一个变量并递增它,它不会更新列表中的值,除非你把变量赋回到列表中。