退出方法后,静态var失去了它的值

时间:2016-10-14 04:24:41

标签: c# unity3d

我正在使用unity 5.5,我遇到了这个问题。

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,为什么?

4 个答案:

答案 0 :(得分:3)

您可以通过从函数中创建全局变量参考关键字或简单返回int ,以多种方式执行此操作。如描述

全局变量

public static int testVal=0;

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

void SetVal()
{
    testVal = 10;
}

参考关键字

public static int testVal=0;

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

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

return int

public int testVal=0;

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

int SetVal()
{
    return 10;
}

答案 1 :(得分:2)

在这里,您将testVal定义为static,以便它可以在类中的所有方法中使用(您也可以通过类名{{1}访问类外的类) })。所以实际上在这种情况下不需要传递变量。

然后,您将变量WhatTheHell.testVal作为pass by值传递给testVal方法,因此它将仅传递值而不是实际变量。这就是改变不反映实际变量的原因。

以下代码将按预期运行:

SetVal()

有关更详细的说明和示例,您可以查看Ehsan Sajjad的Story of Pass By Value and Pass By Reference in C#

答案 2 :(得分:2)

问题是int是值类型而不是引用类型。

当你将'testVal'传递给'SetVal()'时,它会将'testVal'的值复制到'val'中,仅用于方法范围。

如果使用关键字ref,则'val'参数将作为引用类型处理

void SetVal(ref int val)

SetVal(ref testVal);

有关价值和参考类型的更多信息,请访问:https://msdn.microsoft.com/en-us/library/9t0za5es.aspx

答案 3 :(得分:0)

为避免此类错误,我建议您阅读:https://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/stack.html