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

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 类型成员作为参数传递就像按值调用一样工作

From the ref documentation

When used in a method's parameter list, the ref keyword indicates that an argument is passed by reference, not by value. The ref keyword makes the formal parameter an alias for the argument, which must be a variable.

所以我会尽可能简单地解释使形式参数成为别名

没有参考

private MapEntity stageTerrain = new MapEntity(); 中的 stageTerrain 想象成一个装有地址的盒子。

public void RandomChoice(MapEntity mapEntity) 中的 mapEntity 想象成另一个 NEW 盒子。

  • 如果在分配新对象之前更改 mapEntity 的 属性,它也会更改调用变量的值。

当您调用 RandomChoice 时,mapEntity 是一个新框,其内存地址与 stageTerrain 框相同。

现在 mapEntity = stageTerrains[Random.Range(0,selectedList.Count)]; 只会将所选值分配给 New 框。

有参考

public void RandomChoice(ref MapEntity mapEntity) 中的 mapEntity 想象成一个已经存在的盒子的别名,该盒子将使用不同的名称保存内存引用。 (因此别名声明)

当您调用 RandomChoice 时,mapEntity stageTerrain 框。