结构变量传递给方法变为零?

时间:2015-05-29 16:53:34

标签: c# variables struct unity3d local

统一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。只有局部变量才会被处理,但是它作为结构变量传递。

请一些人建议。 感谢。

2 个答案:

答案 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是一个实际的内存块,当它被放入方法时会被复制。因此,当您修改方法中的结构时,您正在更改它的副本,而不是原始结构。对于一个类,它在一个地方被创建为一个单块的内存,当你在方法之间传递它时,你传递一个引用,实质上就是说这里的数据。所以对它的任何修改都是在相同的内存块上进行的,并且在你引用该类的任何地方都可以看到。