Heim >
Artikel > Backend-Entwicklung > Stellen Sie kurz das Deep-Copy-Problem des List
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