C#中使用ref返回结构体却出现复制问题排查
问题根源:调用时未用ref变量接收返回的结构体引用
你所有方法的ref返回声明都是正确的,复制发生在调用代码的变量赋值阶段:
var sprite = result.GetComponent<Sprite>();
这里的var sprite是普通的结构体变量,即便GetComponent<T>()返回的是ref T,如果不用ref关键字修饰变量,C#会自动把返回引用指向的结构体值复制一份到sprite变量中。后续对sprite的修改(比如sprite.Initialise(...)、sprite.Origin = ...)都是在操作这个副本,而非数组中存储的原结构体,所以再次调用GetComponent<Sprite>()时看不到修改效果。
修复方法
将变量声明改为ref var,直接持有原结构体的引用:
ref var sprite = ref result.GetComponent<Sprite>(); sprite.Initialise(spriteTexture, new Point(0, 160), 32, 2, 0.17f); sprite.Origin = new Vector2(0, 0);
同理,另一处调用也需要修改:
ref var gameObjectData = ref result.GetComponent<GameObjectData>(); gameObjectData.ShowDebugInfo = false;
补充说明
C#中,ref返回的引用必须被ref变量接收才能保持引用关系。如果省略ref,编译器会执行隐式的值复制——这是结构体值类型的核心特性:默认所有赋值操作都是值复制,除非显式用ref、in或out关键字传递引用。
内容的提问来源于stack exchange,提问作者Noel
相关产品推荐
相关产品推荐

