统一c#全局结构变量处理像本地惊讶,但需要寻求建议。在START:
struct ST{ public float f; public bool b_toProcess;}ST st;
st = new ST(){b_toProcess = true};
更新中的:
if(st.b_toProcess) process(st);
在同一个.cs中的某个地方:
process(ST st){
Debug.Log("f:" + st.f); // 0
st.f += 0.1f; if( st.f > 5){b_toProcess = false;}
Debug.Log("f:" + st.f); // 0.1f
}
但是过程永无止境!!!! 日志显示f在每次和随后的迭代开始时始终为0,并且在+ = 0.1f之后因此从不大于5.右边它应该在每次迭代时累积。 问题是:为什么每次迭代时st.f始终为0。只有局部变量才会被处理,但是它作为结构变量传递。
请一些人建议。 感谢。
答案 0 :(得分:3)
我的通灵调试能力告诉我你希望 struct 的行为类似于引用类型。
在c#中, structs 是值类型。
当您致电process()
时,将复制整个结构,而不仅仅是参考。您在 struct 中更改的任何内容不都会反映在调用方法的 struct 中。
如果你改为类,那么 的行为就像引用类型一样。
您还可以使用ref
关键字
process(ref ST st)
{
...
}
并像这样称呼它
if(st.b_toProcess)
process(ref st);
答案 1 :(得分:1)
快速回答是将结构更改为类。
解释为什么这会解决问题。 struct和class之间的区别是struct是一个实际的内存块,当它被放入方法时会被复制。因此,当您修改方法中的结构时,您正在更改它的副本,而不是原始结构。对于一个类,它在一个地方被创建为一个单块的内存,当你在方法之间传递它时,你传递一个引用,实质上就是说这里的数据。所以对它的任何修改都是在相同的内存块上进行的,并且在你引用该类的任何地方都可以看到。