问题描述
据我所知,类类型参数始终作为参考传递。 但是每当我传递一个作为参数的类成员的类类型变量时。它总是像 按值调用。
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
}
}
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
}
}
我想知道为什么将类类型成员作为参数传递就像按值调用一样工作
解决方法
当在方法的参数列表中使用时,ref 关键字表示参数是通过引用传递的,而不是通过值传递。 ref 关键字使形参成为实参的别名,实参必须是变量。
所以我将尝试尽可能简单地解释使形参成为别名。
没有参考
将 stageTerrain
中的 private MapEntity stageTerrain = new MapEntity();
想象成一个装有地址的盒子。
将 mapEntity
中的 public void RandomChoice(MapEntity mapEntity)
想象成另一个新框。
- 如果在分配新对象之前更改 mapEntity 的属性,它也会更改调用变量的值。
当您调用 RandomChoice
时,mapEntity
是一个新框,其内存地址与 stageTerrain
框相同。
现在 mapEntity = stageTerrains[Random.Range(0,selectedList.Count)];
将仅将所选值分配给 新建 框。
使用参考
将 mapEntity
中的 public void RandomChoice(ref MapEntity mapEntity)
想象成一个已经存在的框的别名,该框将保存具有不同名称的内存引用。 (因此别名声明)
当您调用 RandomChoice
时,mapEntity
就是 stageTerrain
框。