2016-11-03 4 views
1

y.e [0] .kは20の代わりに30のですか? は何明らかに起こっていることはがた[0] = XE [0]リスト<T> instanciation onコピー

しかし、私は必要なのyはインスタンス化されたXからYへコピーリストにあるだけではなく、あなたがたにポインタXEをコピーすることです;

しかし:X.CはY.Cは私が期待するよう偽である事実です。

どれでも有益なコメントは

class Eclass { 
    public int k { get; set; } 
    public Eclass(int iK) { k = iK; } 
} 

class Sclass { 

    private static int ID = -1; 
    public long Id { get; set; } 
    public bool c { get; set; } 
    public List<Eclass> e { get; set; } 

    public Sclass() { 
     c = false; 
     Id = ++ID; 
     e = new List<Eclass>(); 
    } 

    public Sclass(Sclass org) { 
     c = org.c; 
     Id = ++ID; 
     //foreach (var OrgE in org.e) { e.Add(OrgE); } //also doesn't work 
     //e = org.e.ToList(); 
     e = new List<Eclass>(org.e); 
    } 
} 

class Program { 
    static void Main(string[] args) 
    { 
     Console.WriteLine("steve"); 
     Eclass e1 = new Eclass(1); 
     Eclass e2 = new Eclass(2); 
     Eclass e3 = new Eclass(3); 
     Eclass e4 = new Eclass(4); 

     Sclass x = new Sclass(); 
     x.c = false; 
     x.c = true; 
     x.e.Add(e1); 
     x.e.Add(e2); 
     Sclass y = new Sclass(x); 
     x.e.Add(e3); 
     y.e.Add(e4); 
     x.e[0].k = 10; 
     y.e[0].k = 20; 
     x.c = false; 

     Debug.WriteLine("//{0}// //{1}// :: //{2}// //{3}//", x.c, x.e[0].k, y.c, y.e[0].k); 
     x.c = !x.c; 
     y.c = !y.c; 
     x.e[0].k = 30; 
     Debug.WriteLine("//{0}// //{1}// :: //{2}// //{3}//", x.c, x.e[0].k, y.c, y.e[0].k); 
    } 
} 

// // // 20 // :: //真// // 20 //

// // //を高く評価30 // :: //偽// // 30 //

答えて

-1

コメントを読む。あなたはクレジットが@EdPlunkettに属しているのを見るでしょう

class Eclass { 
    public int k { get; set; } 
    public Eclass(int iK) { k = iK; } 
    public Eclass(Eclass org) { k = org.k; } 
} 

class Sclass { 

    private static int ID = -1; 
    public long Id { get; set; } 
    public bool c { get; set; } 
    public List<Eclass> e { get; set; } 

    public Sclass() { 
     c = false; 
     Id = ++ID; 
     e = new List<Eclass>(); 
    } 

    public Sclass(Sclass org) { 
     c = org.c; 
     Id = ++ID; 
     e = org.e.Select(ec => new Eclass(ec)).ToList(); 
    } 
} 

class Program { 
    static void Main(string[] args) 
    { 
     Console.WriteLine("steve"); 
     Eclass e1 = new Eclass(1); 
     Eclass e2 = new Eclass(2); 
     Eclass e3 = new Eclass(3); 
     Eclass e4 = new Eclass(4); 

     Sclass x = new Sclass(); 
     x.c = false; 
     x.c = true; 
     x.e.Add(e1); 
     x.e.Add(e2); 
     Sclass y = new Sclass(x); 
     x.e.Add(e3); 
     y.e.Add(e4); 
     x.e[0].k = 10; 
     y.e[0].k = 20; 
     x.c = false; 

     Debug.WriteLine("//{0}// //{1}// :: //{2}// //{3}//", x.c, x.e[0].k, y.c, y.e[0].k); 
     x.c = !x.c; 
     y.c = !y.c; 
     x.e[0].k = 30; 
     Debug.WriteLine("//{0}// //{1}// :: //{2}// //{3}//", x.c, x.e[0].k, y.c, y.e[0].k); 
    } 
} 
+0

Cの古い時と同じように、構造体のコピーを作成したいのですか?ファイン。しかし、構造体の値やポイントだけを構造体のインスタンスにコピーしたいのかどうか知っていますか?私はこれについて深く潜り込んだことをうれしく思っています。私は間違って値をコピーするコピーをしようとしていた。 – Steve

4

あなたはSclassコピーコンストラクタを使用してyを作成しました:

そして、この問題は、コピーコンストラクタのSclassにあります。 - 新しいList<Eclass>、古いもので、元のアイテムへの参照を持っているorg.eのコピーを作成します

e = org.e.ToList(); 

y.eがどこから来たのです。したがって、x.e[0]y.e[0]と同じオブジェクトです。 e2の後にそれぞれy.ex.eを追加しますが、決してそれらを見ることはありません。

Eclassは値型ではなく参照型なので、リスト自体のコピーだけでなく、各Eclassインスタンスのコピーを明示的に作成する必要があります。 Eclassclassからstructに変更すると、コピーは自動的に行われます。これは参照型ではないためです。次に、期待したセマンティクスが表示されます。 Eclassint kのように振る舞います。Assignmentは古いオブジェクトへの新しい参照ではなく、値の新しいコピーを作成します。ずっとSclassのための1つのように、またはそれをコピーコンストラクタを与える -

これを行うには、より通常の方法、しかし、Eclassの新しい、同一のコピーを返すcloneメソッドをEclass与えることであろう。私はコピーのコンストラクタがClone()よりも好きです。なぜなら、.NETフレームワークはそれらをもっと使う傾向があり、この場合、すでにSclassの1つを取得しているからです。一貫性を保つ。

public Eclass { 
    public Eclass() {} 
    public Eclass(int k) { 
     this.k = k; 
    } 
    public Eclass(Eclass org) { 
     k = org.k; 
    } 
} 

そしてSclassのコピーコンストラクタでは、そのように電子をコピーします。

public Sclass(Sclass org) { 
    c = org.c; 
    Id = ++ID; 

    // For each item in org.e, create an identical copy, and then make a list of those. 
    e = org.e.Select(ec => new Eclass(ec)).ToList(); 
} 

これは、「ディープコピー」と呼ばれている:それは「ルート」オブジェクトのコピーを作成し、でそれを移入しますそれが参照するすべての参照型オブジェクトのコピー。

あなたが今やっていることは、「浅いコピー」です。

+0

しかし何らかの理由で.ToList()も失敗しています。私は最初にポーズされたコードを編集しました。リストのforeach()でさえ、仕事は終わっていません。 .Add()はOrgEのメモリアドレスをリストにコピーするだけです。すべてのx.eについて、新しいeがインスタンス化されていないend x.eがy.eにコピーされます。 〜OH。あなたはまだ私がまだ読んでいないことをさらに追加しています。 – Steve

+0

@Steve新しいバージョンのコードを表示できますか?あなたが何を記述しているのか分かりません。 –

+1

Dang。あなたは再び勝つ。ちょうど1つのメモ。私はe3に「x」、e4にyを与えました。そして私が知覚するとき、このxは3 e(s)を持ち、yは3も持っています。 – Steve

関連する問題