将对象传递给静态函数时,其中一个字段将更改为随机数

时间:2016-04-28 06:43:06

标签: c# unity3d static static-methods corruption

所以我正在开发一个Unity / C#项目,我有一个名为GridObject的类和一个名为GridRect的结构,它包含静态方法PrintX(GridObject obj)

更新:我终于尝试创建一个全新的Unity项目并添加最少数量的课程。事实证明,复制比我预期的要容易得多!

测试代码,用于设置对象并调用PrintX()

using UnityEngine;

public class CorruptionTest : MonoBehaviour {
    public GridObject gridObject;

    public void Start() {
        var gridObj = new GridObject();
        gridObj.rect = new GridRect();
        gridObj.rect2 = new GridRect2();
        gridObj.rect.x = 1;
        gridObj.rect2.x = 1;

        GridRect.PrintX(gridObj);
        GridRect2.PrintX(gridObj);
    }   
}

这是我的专业GridObject课程:

public class GridObject {
    public GridRect rect;
    public GridRect2 rect2;
}

我的GridRect结构:

using UnityEngine;

public struct GridRect {
    public int x;
    public int y;

    public static void PrintX(GridObject gridObj) {
        GridRect rect = gridObj.rect;
        GridRect2 rect2 = gridObj.rect2;

        Debug.Log(rect.x);           // prints 518506984
        Debug.Log(gridObj.rect.x);   // prints 1
        Debug.Log(rect2.x);          // prints 1
        Debug.Log(gridObj.rect2.x);  // prints 1
    }
}

GridRect2除名称外是相同的:

using UnityEngine;

public struct GridRect2 {
    public int x;
    public int y;

    public static void PrintX(GridObject gridObj) {
        GridRect rect = gridObj.rect;
        GridRect2 rect2 = gridObj.rect2;

        Debug.Log(rect.x);           // prints 1
        Debug.Log(gridObj.rect.x);   // prints 1
        Debug.Log(rect2.x);          // prints 518506984
        Debug.Log(gridObj.rect2.x);  // prints 1
    }
}

这展示了一些有趣的事情:

  1. 设置本地变量xGridRect时,GridRect2rect结构的rect2字段已损坏,但访问它时#34 ;到位"在Debug.Log(gridObj.rect.x);
  2. 行中正常工作
  3. 只有当被访问的结构与静态方法的位置相同时才会发生损坏,即GridRect rect = gridObj.rect;GridRect2版本的PrintX()中工作,而不是GridRect 1}}版本。
  4. GridRectGridRect2示例的错误值相同。
  5. 所以我完全不知道这里会发生什么。我怀疑这是Unity的序列化代码中的一个错误,但在从等式中删除后仍然会发生。唯一似乎有效的是将静态函数移动到另一个类。

1 个答案:

答案 0 :(得分:-1)

您可以尝试将对象复制到另一个临时对象中吗?

public static void PrintX(GridObject gridObj) {
    GridObject tmpgridObj = gridObj;
    GridRect rect = tmpgridObj.rect;
    Debug.Log(rect.x);
}

我生锈但我相信直接传递和对象只是传递对原始对象的引用,而不是它的值。