繁体   English   中英

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

从参考文档

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

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

没有参考

想象一下来自私有stageTerrain private MapEntity stageTerrain = new MapEntity();的 stageTerrain 作为一个包含地址的盒子。

想象一下来自public void RandomChoice(MapEntity mapEntity) mapEntity mapEntity 作为另一个框。

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

当您调用RandomChoice时, mapEntity是一个新框,它与stageTerrain框具有相同的 memory 地址。

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

带参考

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

当您调用RandomChoice时, mapEntitystageTerrain框。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM