c#将类类型成员作为参数传递作为按值调用

问题描述

据我所知,类类型参数始终作为参考传递。 但是每当我传递一个作为参数的类成员的类类型变量时。它总是像 按值调用

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 
    }
}

我想知道为什么将类类型成员作为参数传递就像按值调用一样工作

解决方法

From the ref documentation

当在方法的参数列表中使用时,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 框。