[英]c# passing class type member as parameter works as call by value
据我所知,class 类型参数始终作为参考传递。 但是每当我传递一个 class 类型变量时,它是 class 成员作为参数。 它总是像按值调用一样工作。
public class MapGenerator : MonoBehaviour
{
[SerializeField]
private List<MapEntity> stageTerrains = new List<MapEntity>();
private MapEntity stageTerrain = new MapEntity();
private void Start()
{
RandomChoice(stageTerrains);
}
public void RandomChoice(MapEntity mapEntity)
{
mapEntity = stageTerrains[Random.Range(0,selectedList.Count)];
Print(mapEntity); //it always works well
Print(stageTerrain); // always print null
}
}
所以我在参数中添加了一个 ref 关键字,它作为引用调用
public class MapGenerator : MonoBehaviour
{
[SerializeField]
private List<MapEntity> stageTerrains = new List<MapEntity>();
private MapEntity stageTerrain = new MapEntity();
private void Start()
{
RandomChoice(ref stageTerrains);
}
public void RandomChoice(ref MapEntity mapEntity)
{
mapEntity = stageTerrains[Random.Range(0,selectedList.Count)];
Print(mapEntity); //it always works well
Print(stageTerrain); // print well too
}
}
我想知道为什么将 class 类型成员作为参数传递就像按值调用一样工作
当在方法的参数列表中使用时,ref 关键字表示参数是通过引用而不是值传递的。 ref 关键字使形参成为实参的别名,实参必须是变量。
因此,我将尝试解释使形式参数尽可能简单的别名。
想象一下来自私有stageTerrain
private MapEntity stageTerrain = new MapEntity();
的 stageTerrain 作为一个包含地址的盒子。
想象一下来自public void RandomChoice(MapEntity mapEntity)
mapEntity
mapEntity 作为另一个新框。
当您调用RandomChoice
时, mapEntity
是一个新框,它与stageTerrain
框具有相同的 memory 地址。
现在mapEntity = stageTerrains[Random.Range(0,selectedList.Count)];
将仅将选定的值分配给“新建”框。
想象一下来自public void RandomChoice(ref MapEntity mapEntity)
mapEntity
mapEntity 作为一个已经存在的盒子的别名,该盒子将使用不同的名称保存 memory 引用。 (因此别名声明)
当您调用RandomChoice
时, mapEntity
是stageTerrain
框。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.