2016-10-14 11 views
-1

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

あなたは他の人があなたを理解し、あなたのコードを読むことができる、あなたのクラス 'lol'と' asd'命名停止、特にクラス名の小文字を使用したい場合。意味のある名前を使用し、共通のコーディングガイドラインに従ってください。私にとっては、これだけで私は助けようとはしませんでした。 –

+0

短い答え:ここでは 'matrice = newMatrice;'あなたの 'Form1_Load'に' mat'にリンクされた配列を再作成しません。参照が2つの異なるオブジェクトを指すように、参照を再割り当てします。 –

+0

私はクラス名を変更します、申し訳ありません。 – CRK

答えて

0

問題があるあなたがクラスでmat変数を変更することはできませんので、彼らは..同じオブジェクトをrefはありません。参照のコピーを取得し、コピーを変更しています。参照を変更できるようにするには、クラスにラップする必要があります。ラッパー参照のコピーを取得しますが、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 
+0

私は問題が変数の再割り当て(iniziaの最後の命令)だと思う。 – CRK

+0

yep: 'matrice = newMatrice;' –

+0

なぜ再割り当てがそれを指していると元の参照に影響しないのか分からない。さて、私は変数を再割り当てすることを理解しますが、その変更が元の参照に影響するようにするにはどうすればいいですか? – CRK

関連する問題