Heim  >  Artikel  >  Backend-Entwicklung  >  Stellen Sie kurz das Deep-Copy-Problem des List-Objekts in C# vor

Stellen Sie kurz das Deep-Copy-Problem des List-Objekts in C# vor

黄舟
黄舟Original
2017-03-29 11:32:421684Durchsuche

Der folgende Editor bietet Ihnen eine kurze Diskussion über das Deep-Copy-Problem von List8742468051c85b06f0a0af9e3e506b5cObject in C#. Der Herausgeber findet es ziemlich gut, deshalb teile ich es jetzt mit Ihnen und gebe es als Referenz. Folgen wir dem Editor und werfen wir gemeinsam einen Blick darauf

1. Wenn T im List8742468051c85b06f0a0af9e3e506b5c ein Werttyp ist (int-Typ usw.)

Für eine Liste von Werttypen können Sie sie direkt mit der folgenden Methode kopieren:

List<T> oldList = new List<T>(); 
oldList.Add(..); 
List<T> newList = new List<T>(oldList);

2. Wenn T im List8742468051c85b06f0a0af9e3e506b5c-Objekt eine Referenz ist Typ (z. B. eine benutzerdefinierte Entitätsklasse)

1. Der Referenztyp List kann nicht mit der oben genannten Methode kopiert werden. Sie können nur die Referenzen der Objekte in der Liste kopieren Verwenden Sie zum Kopieren die folgende Erweiterungsmethode:

static class Extensions 
 { 
     public static IList<T> Clone<T>(this IList<T> listToClone) where T: ICloneable 
     { 
         return listToClone.Select(item => (T)item.Clone()).ToList(); 
     } 
 //当然前题是List中的对象要实现ICloneable接口
 }

2. Eine andere Methode der Serialisierung wird verwendet, um eine tiefe Kopie des Referenzobjekts zu erstellen. Diese Methode ist die zuverlässigste.

public static T Clone<T>(T RealObject) 

{ 
   using (Stream objectStream = new MemoryStream()) 
   { 
      //利用 System.Runtime.Serialization序列化与反序列化完成引用对象的复制
       IFormatter formatter = new BinaryFormatter(); 
       formatter.Serialize(objectStream, RealObject); 
       objectStream.Seek(0, SeekOrigin.Begin); 
       return (T)formatter.Deserialize(objectStream); 
   } 
}

3. Verwenden Sie System.Xml.Serialization, um Serialisierung und Deserialisierung zu implementieren

public static T Clone<T>(T RealObject) 
{ 
      using(Stream stream=new MemoryStream())
      {
        XmlSerializer serializer = new XmlSerializer(typeof(T));
        serializer.Serialize(stream, RealObject);
        stream.Seek(0, SeekOrigin.Begin);
        return (T)serializer.Deserialize(stream);
      }
}

3. Testen Sie die tiefe Kopie der oben genannten Objekte

Der Test läuft wie folgt ab:

using System;
using System.Collections.Generic;
using System.Collections ;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

namespace LINQ
{
  [Serializable]
  public class tt
  {
    private string name = "";

    public string Name
    {
      get { return name; }
      set { name = value; }
    }
    private string sex = "";

    public string Sex
    {
      get { return sex; }
      set { sex = value; }
    }
  }

  class LINQTest
  {
    public static T Clone<T>(T RealObject) 
    { 
      using (Stream objectStream = new MemoryStream()) 
      { 
        IFormatter formatter = new BinaryFormatter(); 
        formatter.Serialize(objectStream, RealObject); 
        objectStream.Seek(0, SeekOrigin.Begin); 
        return (T)formatter.Deserialize(objectStream); 
      } 
    }


    public static void Main()
    {
      List<tt> lsttt = new List<tt>();
      tt tt1 = new tt();
      tt1.Name = "a1";
      tt1.Sex = "20";
      lsttt.Add(tt1);
      List<tt> l333 = new List<tt>();
      l333.Add(Clone<tt>(lsttt[0]));
      l333[0].Name = "333333333";
   }
 }
}

Das obige ist der detaillierte Inhalt vonStellen Sie kurz das Deep-Copy-Problem des List-Objekts in C# vor. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn