微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 框。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。