2016-10-14 6 views
1

私はユニティ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; 
    } 
} 

デバッグ結果は10 insted 10です。なぜですか?

+0

あなたのコードで 'static'変数' SetVal'が明示的に初期化されることはなく、デフォルトの '0'を持っています – manish

答えて

2

ここでtestValstaticと定義されているため、クラス内のすべてのメソッドで使用できるようになります(クラス外でもアクセスできます。クラス名は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; 
} 

をさらに詳細に説明し、たとえば、あなたがエサンSAJJADによって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()'に渡すと、メソッドスコープの 'val'に 'testVal'の値のコピーが作成されます。

キーワードREFを使用する場合は、「ヴァル」引数が参照型ここでは値と参照型について

void SetVal(ref int val) 

SetVal(ref testVal); 

もっととして扱うことになります。このタイプIの他の過ちを避けるためにhttps://msdn.microsoft.com/en-us/library/9t0za5es.aspx

0
+0

リンクをありがとうございます:-) –

+0

通常は読んでいる記事のタイプは間違いありませんが、スタックを理解することは、最初の例がうまくいかなかった理由を理解するのに役立ちます。また、特定の方法でプログラミングしているときにコンピュータにかかる負荷を理解することについて知っておくと良いと感じています。 –

関連する問題