2016-10-14 18 views
1

我正在使用unity 5.5,並且遇到了這個問題。靜態var在退出方法後失去了它的值

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class WhatTheHell : MonoBehaviour 
{ 
    public static int testVal; 

    void Awake() 
    { 
     SetVal(testVal); 
     Debug.Log(testVal); 
    } 

    void SetVal(int val) 
    { 
     val = 10; 
    } 
} 

調試結果是0 insted 10.爲什麼?

+0

靜態變量SetVal在您的代碼中永遠不會初始化,因此它的默認值爲'0' – manish

回答

2

在這裏,您將testVal定義爲static,因此它將在班級內的所有方法中可用(您可以通過班級名稱WhatTheHell.testVal在班級以外的地方訪問它們)。所以實際上在這種情況下不需要傳遞變量。

然後,您將變量testVal傳遞給SetVal()方法作爲按值傳遞,因此它只會傳遞值而不是實際變量。這就是爲什麼變化不能反映實際變量。

下面的代碼將作爲你的預期:

public static int testVal=0; 

void Awake() 
{ 
    Debug.Log(testVal); // print 0 
    SetVal(); 
    Debug.Log(testVal); // print 10 
} 

void SetVal() 
{ 
    testVal = 10; 
} 

如需更詳細的解釋,例如,你可以看看到Story of Pass By Value and Pass By Reference in C#通過伊赫桑薩賈德。

+0

非常感謝! –

3

你可以通過全局變量,從功能ref關鍵字或簡單返回INT執行此操作的多種方式。作爲描述

全局變量

public static int testVal=0; 

void Awake() 
{ 
    SetVal(); 
    Debug.Log(testVal); // print 10 
} 

void SetVal() 
{ 
    testVal = 10; 
} 

ref關鍵字

public static int testVal=0; 

void Awake() 
{ 
    SetVal(ref testVal); 
    Debug.Log(testVal); // print 10 
} 

void SetVal(ref int testVal) 
{ 
    testVal = 10; 
} 

回報INT

public int testVal=0; 

void Awake() 
{ 
    testVal = SetVal(); 
    Debug.Log(testVal); // print 10 
} 

int SetVal() 
{ 
    return 10; 
} 
2

問題是int是一個值類型而不是引用類型。

將'testVal'傳遞給'SetVal()'時,它將'testVal'的值複製到'val'中,僅用於方法範圍。

如果您使用關鍵字裁判,「VAL」的說法將被處理爲引用類型

void SetVal(ref int val) 

SetVal(ref testVal); 

更多的價值和引用類型在這裏:https://msdn.microsoft.com/en-us/library/9t0za5es.aspx

0

爲了避免這種類型的我的其他錯誤將鼓勵您閱讀:https://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/stack.html

+0

感謝您的鏈接,我會看看:-) –

+0

這絕對不是您通常閱讀的文章的類型,但瞭解堆棧將幫助您理解爲什麼您的第一個示例不起作用。另外,我只是覺得在瞭解編程某種特定方式時計算機上的負載方面很好。 –