为什么它不维护对象的引用?

时间:2016-10-14 10:01:36

标签: c# class object methods reference

如果nuovo.matrice引用相同的对象但不维护方法完成的数组重新分配,我无法弄清楚为什么MessageBox显示“false”。为什么nuovo.matrice == mat如果引用同一个对象则为false?

namespace WindowsFormsApplication15

{     公共部分类Form1:表格     {         公共Form1()         {             的InitializeComponent();         }

    class Class1
    {
        public ClassType[] matrice;

        public class ClassType
        {
            public string a { get; set; }
            public int b { get; set; }
        }
    }

    Class1.ClassType[] mat;


    private void Form1_Load(object sender, EventArgs e)
    {
        Class1 test = new Class1();
        Class1.ClassType prova = new Class1.ClassType();
        test.matrice = new Class1.ClassType[1];
        test.matrice[0] = prova;
        mat = test.matrice;
        mat[0].a = "rtuier";
        mat[0].b = 94;
        Modify nuovo = new Modify(mat);
        nuovo.inizia();
        MessageBox.Show((nuovo.matrice == mat).ToString());

    }

    class Modify
    {
        public Class1.ClassType[] matrice;

        public Modify(Class1.ClassType[] mat)
        {
            matrice = mat;
        }

        public void inizia()
        {
            matrice[0].a = "asuidh";
            matrice[0].b = 123;

            Class1.ClassType[] newMatrice = new Class1.ClassType[2];
            Class1.ClassType ins = new Class1.ClassType { a = "pollo", b = 456 };
            newMatrice[0] = matrice[0];
            newMatrice[1] = ins;
            matrice = newMatrice;
        }
    }
}

}

1 个答案:

答案 0 :(得分:0)

问题是,他们没有引用相同的对象..因为你不能改变类中的mat变量。您获得了参考文献的副本,并且您正在更改副本。如果您希望能够修改引用,则应将其包装在类中。然后,您将获得包装器引用的副本,但Class1字段是唯一的。

类包装示例:

public class ClassType
{
    public string a { get; set; }
    public int b { get; set; }
}

public class Class1
{
    public ClassType[] classType;
}

public class Wrapper
{
    public Class1 WrappedClass1;
}

public class Class2
{
    public Wrapper Wrapped;

    public Class2(Wrapper wrapper)
    {
        Wrapped = wrapper;
    }

    public void ChangeClass1()
    {
        WrappedClass1.WrappedClass1 = new Class1();
    }
}

Class1 class1 = new Class1();

Wrapper wrapper = new Wrapper();

wrapper.WrappedClass1 = class1;

Class2 class2 = new Class2(wrapper);

class2.ChangeClass1();

MessageBox.Show(wrapper.WrappedClass1 == class2.Wrapped.WrappedClass1); // <--- true