【问题标题】:c# class being overridden and can not be assignedc# 类被覆盖且无法分配
【发布时间】:2015-04-15 10:57:57
【问题描述】:

我有这样的代码

[System.Serializable] public class class1 {
    [System.Serializable] public class class2 {
        public int var1, var2; public string var3;
        public class2 () {}
        public class2 (int v1, int v2, string v3) {
            var1 = v1;
            var2 = v2;
            var3 = v3;
        }
    }
    public class2[] list;
}
public class1 _class1;
public void Assign () {
    _class1 = new class1 ();
    _class1.list = new class1.class2[3];
    for (int i = 0; i < 3; i ++) {
        _class1.list[i] = new class1.class2((int)Random.Range (10,20), (int)Random.Range (100,200), ((int) Random.Range(50, 75)).ToString ());
    }

}

这段代码我还连接了其他脚本,它从这里读取值,但我得到的是

_class1.list[] 里面的所有对象都被冻结了,我无法更改它们的值,我更改了值,它们又被设置为 0。

我用这样的代码来复制

//inside class1
public static class1 copy (class1 tocopy) {
    class1 copy = new class1 ();
    copy.list = tocopy.list;
    return copy;
}
public class1 copy () {
    return class1.copy (this);
}

//inside class2
public static class2 copy (class2 tocopy) {
    class2 copy = new class2 ();
    copy.var1 = tocopy.var1;
    copy.var2 = tocopy.var2;
    copy.var3 = tocopy.var3;
    return copy;
}
public class2 copy () {
    return class2.copy (this);
}

即使这样做,我也会得到一个与 classX 链接的类 copy = new classX ();

当我尝试为其分配值时,它会立即重新分配它在生成副本时所具有的值。

我这样做是因为当我不使用 copy() 时,它使列表的所有值都具有相同的最后一个值,我将更改 1 的值,并将其应用于所有值,它们有一个实例,一个克隆,我不知道如何调用,一个引用。

我不知道如何删除这个引用,因为我现在正在引用一个新对象,所以现在我没有引用那个类,所以更好的是,它不会将值分配给我复制的类。但我得到了我无法分配这个的问题。

我该如何解决这个问题?

【问题讨论】:

  • 您的代码甚至无法编译。那你要什么?
  • 您是否尝试过调试它以查看您的列表是否多次包含相同的对象?如果您为每个类添加一个唯一标识符,如 GUID(例如,在每个类中添加 string guid = new Guid().ToString(); 作为字段)然后覆盖 ToString 方法以返回该字符串,它会更容易一些。跨度>
  • '[System.Serializable] public class class1 { [System.Serializable] public class class2 { public int var1, var2;公共字符串 var3; public class2 () {} public class2 (int v1, int v2, string v3) { var1 = v1; var2 = v2; var3 = v3; } } 公共类 2[] 列表; } 公共类 1 _class1;公共无效分配(){_class1 =新类1(); _class1.list = 新的 class1.class2[3]; for (int i = 0; i
  • 我把它编译好了,但在每种情况下这都不是完整的代码,因为它有超过 1000 行,这只是它的一个小版本。
  • 我试过 guid,它打印我“00000000-0000-0000-0000-000000000000”

标签: c# class reference clone variable-assignment


【解决方案1】:

问题不是很清楚,但我认为问题是因为您只是在做一个浅拷贝,请尝试更改class1.copy 以复制列表的每个项目:

public static class1 copy (class1 tocopy) {
    class1 copy = new class1 ();
    copy.list = new class1.class2[tocopy.list.Length];
    for(int i = 0; i < tocopy.list.Length; i++) {
        copy.list[i] = tocopy.list[i].copy();
    }
    return copy;
}

【讨论】:

  • 谢谢,也试过了,但问题是 [class1].copy ().list[i] 无法赋值,我尝试赋值,它立即清除了值,并且重置前一个
  • 你真的在调用Assign吗?
  • 我愿意,但这只是完整的 1000 条代码线加代码的开玩笑版本。我说没有重载,(everyframe 分配 0 的东西),我尝试了一切,但没有阻止它清除值,因为该类是从它的引用中设置的。有没有办法得到它的引用?
  • 您实际上可以使用 C# 中的不安全代码来处理指针,如下所述:msdn.microsoft.com/en-us/library/t2yzs44b.aspx,但我怀疑这是否能解决问题。没有更多上下文,很难进一步帮助您。
  • 是的,不,在这种情况下我没有使用指针,但我发现通过循环和复制()每个元素来解决我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
  • 2018-02-08
  • 2021-10-19
  • 1970-01-01
相关资源
最近更新 更多