首页 > 解决方案 > 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 
    }
}

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

标签: c#call-by-value

解决方案


从参考文档

当在方法的参数列表中使用时,ref 关键字表示参数是通过引用而不是值传递的。ref 关键字使形参成为实参的别名,实参必须是变量。

因此,我将尝试解释使形式参数尽可能简单的别名。

没有参考

stageTerrain将from想象private MapEntity stageTerrain = new MapEntity();成一个包含地址的盒子。

mapEntity将from想象public void RandomChoice(MapEntity mapEntity)成另一个盒子。

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

当您调用时,RandomChoicemapEntity是一个新的盒子,它与盒子拥有相同的内存地址stageTerrain

现在mapEntity = stageTerrains[Random.Range(0,selectedList.Count)];将仅将选定的值分配给“新建”框。

带参考

想象一下mapEntityfrompublic void RandomChoice(ref MapEntity mapEntity)作为一个已经存在的盒子的别名,它将保存具有不同名称的内存引用。(因此别名声明)

当您调用时RandomChoicemapEntity 就是 stageTerrain框。


推荐阅读