2015-05-29 50 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);