2015-05-29 27 views
-1

统一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。只有局部变量会被这样处理,但是这是作为一个结构变量传入的。

请some1指教。 谢谢。

+1

你应该阅读:https://msdn.microsoft.com/en-us/library/ aa664472%28v = vs.71%29.aspx – ach

回答

1

快速的答案是改变你的结构类。

解释为什么这会解决问题。结构和类之间的区别在于结构是一个实际的内存块,当它被放入方法时被复制。所以当你在一个方法中修改一个结构时,你正在改变它的一个副本,而不是原来的。对于一个类,它在一个地方被创建为一个单独的内存块,并且当你在两个方法之间传递它时,你传递一个参考,实际上这个参考是指向这里的这个数据。因此,对它的任何修改都是在同一块内存上进行的,并且在引用该类的任何位置都可以看到。

+0

将类分配为_“单块内存”_通常不是一个好主意。 – MickyD

+0

我知道这是不准确的,但它可以用于说明这里的重点(可能) –

+0

同意,对于'ST'类上面没关系 – MickyD

3

我的心理调试能力告诉我,你期望你的结构行为像一个引用类型。

在c#

结构是值类型。


当你调用process(),整个结构被复制,不只是参考。您在结构改变任何东西会反映在调用方法的结构


如果你让一个类代替,那么它就会像一个引用类型。

,你也可以使用关键字ref

process(ref ST st) 
{ 
    ... 
} 

,并调用它

if(st.b_toProcess) 
    process(ref st);