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
}
}
我想知道为什么将类类型成员作为参数传递就像按值调用一样工作
解决方案
当在方法的参数列表中使用时,ref 关键字表示参数是通过引用而不是值传递的。ref 关键字使形参成为实参的别名,实参必须是变量。
因此,我将尝试解释使形式参数尽可能简单的别名。
没有参考
stageTerrain
将from想象private MapEntity stageTerrain = new MapEntity();
成一个包含地址的盒子。
mapEntity
将from想象public void RandomChoice(MapEntity mapEntity)
成另一个新盒子。
- 如果在分配新对象之前更改 mapEntity 的属性,它也会更改调用变量的值。
当您调用时,RandomChoice
这mapEntity
是一个新的盒子,它与盒子拥有相同的内存地址stageTerrain
。
现在mapEntity = stageTerrains[Random.Range(0,selectedList.Count)];
将仅将选定的值分配给“新建”框。
带参考
想象一下mapEntity
frompublic void RandomChoice(ref MapEntity mapEntity)
作为一个已经存在的盒子的别名,它将保存具有不同名称的内存引用。(因此别名声明)
当您调用时RandomChoice
,mapEntity
就是 stageTerrain
框。
推荐阅读
- asp.net-core - 在 Kestrel 实例之间共享服务
- java - 圆圈未显示在 JPanel 中
- javascript - 动态更新 ChartJS 后的 JavaScript
- javascript - 功能组件仅在部署后渲染两次
- django - Django达到序列的最大值
- swift - 如何根据字典键的值初始化字典键数组
- pyautogui - 当搜索到的图像不存在时 Pyautogui locateOnScreen 处理
- javascript - 如何使用 jQuery 从选项卡中获取名称并将名称数据从主机表发送到名称表?-App 脚本
- c - 从 char[ ] 和 int 创建一个 char 字符串
- amazon-web-services - 配置 API Gateway 方法以从阶段继承限制设置