In einigen Fällen müssen wir Daten aus der Datenbank lesen, um das Objekt zu füllen, oder die Datei von der Festplatte lesen, um das Objekt zu füllen, aber das ist relativ zeitaufwändig. Zu diesem Zeitpunkt denken wir an das Kopieren von Objekten. Dieser Artikel analysiert die Verwendung von C# Shallow Copy und Deep Copy anhand von Beispielen. Die Details lauten wie folgt:
1. Flache Kopie
1. Was ist „flache Kopie“:
Beim Vorabkopieren eines Objekts für die Werttypmitglieder von Das Objekt kopiert sich selbst. Für Referenztypmitglieder des Objekts wird nur die Objektreferenz kopiert. Diese Referenz verweist auf die Objektinstanz im verwalteten Heap.
2. Es gibt ein Objekt, das Klassenmitglieder vom Referenztyp und Strukturmitglieder vom Werttyp enthält.
Cinema enthält das Referenztypmitglied Room und das Werttypmitglied Film.
public class Room { public int _maxSeat; public Room(int maxSeat) { this._maxSeat = maxSeat; } } public struct Film { public string _name; public Film(string name) { this._name = name; } } public class Cinema { public Room _room; public Film _film; public Cinema(Room room, Film film) { this._room = room; this._film = film; } public object Clone() { return MemberwiseClone(); //对引用类型实施浅复制 } }
3. Testen Sie den Effekt nach dem Kopieren
① Drucken Sie die Werte der Werttyp- und Referenztypmitglieder des Originalobjekts vor dem Kopieren aus
② Drucken Sie für die Originalobjektkopie die Werte der Werttyp- und Referenztypmitglieder des kopierten Objekts aus.
③ Ändern Sie den Wert des Originalobjekts, drucken Sie die Werttyp- und Referenztypmitglieder des Originals aus Objekt erneut
④ Werttyp und Referenztyp des kopierten Objekts erneut drucken Mitgliedswert
static void Main(string[] args) { Room room1 = new Room(60); Film film1 = new Film("家园防线"); Cinema cinema1 = new Cinema(room1, film1); Cinema cinema2 = (Cinema)cinema1.Clone(); Console.WriteLine("拷贝之前,结构成员的字段值为{0},引用类型成员的字段值为{1}", cinema1._film._name,cinema1._room._maxSeat); Console.WriteLine("拷贝之后,新的结构成员的字段值为{0},引用类型成员的字段值为{1}", cinema2._film._name, cinema2._room._maxSeat); //修改拷贝之前引用类型的字段值 cinema1._film._name = "极品飞车"; cinema1._room._maxSeat = 80; Console.WriteLine("修改之后,结构成员的字段值为{0},引用类型成员的字段值为{1}", cinema1._film._name, cinema1._room._maxSeat); Console.WriteLine("修改之后,新的结构成员的字段值为{0},引用类型成员的字段值为{1}", cinema2._film._name, cinema2._room._maxSeat); Console.ReadKey(); }
Analyse:
Der Kernpunkt der flachen Kopie ist dass der Referenztyp in die Objektreferenz kopiert wird, die auf die Objektinstanz auf dem verwalteten Heap verweist. Das Ändern des Werts des ursprünglichen entsprechenden Referenztyps wirkt sich auf das kopierte Objekt aus.
2. Deep Copy
1. Was ist „Deep Copy“?
Kopieren Sie das Objekt, auf das das Referenzmitglied zeigt, und weisen Sie den in der ursprünglichen Objektinstanz enthaltenen Wert zu Erstellen Sie die verwalteten Heap-Daten und erstellen Sie dann eine neue Objektinstanz auf dem verwalteten Heap.
2. Tiefenkopie durch Kopieren jedes Objektmitglieds
public object Clone() { Room room = new Room(); room._maxSeat = this._room._maxSeat;//复制当前引用类型成员的值到新对象 Film film = this._film; //值类型直接赋值 Cinema cinema = new Cinema(room, film); return cinema; }
3. Tiefenkopie kann auch durch Serialisierung und Deserialisierung erfolgen
public object Clone1() { BinaryFormatter bf = new BinaryFormatter(); MemoryStream ms = new MemoryStream(); bf.Serialize(ms, this); //复制到流中 ms.Position = 0; return (bf.Deserialize(ms)); }
4. Verwenden Sie Deep Copy für Serialisierung und Deserialisierung, aber alle Klassen müssen mit [Serialisierbar] markiert sein:
[Serializable] public class Room { public int _maxSeat; public Room() {} public Room(int maxSeat) { this._maxSeat = maxSeat; } } [Serializable] public struct Film { public string _name; public Film(string name) { this._name = name; } } [Serializable] public class Cinema { public Room _room; public Film _film; public Cinema(Room room, Film film) { this._room = room; this._film = film; } //浅拷贝 //public object Clone() //{ // return MemberwiseClone(); //对引用类型实施浅复制 //} //深拷贝 对每个对象成员进行复制 public object Clone() { Room room = new Room(); room._maxSeat = this._room._maxSeat;//复制当前引用类型成员的值到新对象 Film film = this._film; //值类型直接赋值 Cinema cinema = new Cinema(room, film); return cinema; } //使用序列化和反序列化进行复制 public object Clone1() { BinaryFormatter bf = new BinaryFormatter(); MemoryStream ms = new MemoryStream(); bf.Serialize(ms, this); //复制到流中 ms.Position = 0; return (bf.Deserialize(ms)); } }
5. Testen Sie den Effekt nach dem Kopieren
① Drucken Sie vor dem Kopieren die Werte der Werttyp- und Referenztypmitglieder des Originalobjekts aus.
② Drucken Sie für die Originalobjektkopie den Werttyp und die Referenz von aus das kopierte Objekt Der Wert des Typmitglieds
③ Ändern Sie den Wert des Originalobjekts und drucken Sie den Werttyp und das Referenztypmitglied des Originalobjekts erneut
④ Drucken Sie den Wert des kopierten Objektwerttyps und Referenztyps Mitglied wieder
static void Main(string[] args) { Room room1 = new Room(60); Film film1 = new Film("家园防线"); Cinema cinema1 = new Cinema(room1, film1); Cinema cinema2 = (Cinema)cinema1.Clone1(); Console.WriteLine("拷贝之前,结构成员的字段值为{0},引用类型成员的字段值为{1}", cinema1._film._name,cinema1._room._maxSeat); Console.WriteLine("拷贝之后,新的结构成员的字段值为{0},引用类型成员的字段值为{1}", cinema2._film._name, cinema2._room._maxSeat); //修改拷贝之前引用类型的字段值 cinema1._film._name = "极品飞车"; cinema1._room._maxSeat = 80; Console.WriteLine("修改之后,结构成员的字段值为{0},引用类型成员的字段值为{1}", cinema1._film._name, cinema1._room._maxSeat); Console.WriteLine("修改之后,新的结构成员的字段值为{0},引用类型成员的字段值为{1}", cinema2._film._name, cinema2._room._maxSeat); Console.ReadKey(); }
Ergebnis:
Analyse:
Nach tief Beim Kopieren wurden die Referenzelemente der beiden Objekte getrennt. Das Ändern des Werts des Referenztypelements des ursprünglichen Objekts hat keinen Einfluss auf den Wert des Referenztypelements des kopierten Objekts.
Weitere Artikel zur C#-Analyse von Shallow-Copy- und Deep-Copy-Beispielen finden Sie auf der chinesischen PHP-Website!

C# und .NET-Laufzeit arbeiten eng zusammen, um Entwickler effiziente, leistungsstarke und plattformübergreifende Entwicklungsfähigkeiten zu befähigen. 1) C# ist eine vom Typ befindliche und objektorientierte Programmiersprache, die so konzipiert ist, dass sie nahtlos in das .NET-Framework integriert werden. 2) Die .NET-Laufzeit verwaltet die Ausführung von C# Code, bietet Müllsammlung, Type Sicherheit und andere Dienste und sorgt für einen effizienten und plattformübergreifenden Betrieb.

Um die C# .NET -Entwicklung zu starten, müssen Sie: 1. Verstehen Sie das Grundkenntnis von C# und die Kernkonzepte des .NET -Frameworks; 2. Meister Sie die grundlegenden Konzepte von Variablen, Datentypen, Kontrollstrukturen, Funktionen und Klassen; 3.. 4. Mit Debugging -Techniken und Leistungsoptimierungsmethoden für häufige Fehler vertraut sein. Mit diesen Schritten können Sie nach und nach in die Welt von C#.NET eindringen und effiziente Anwendungen schreiben.

Die Beziehung zwischen C# und .NET ist untrennbar miteinander verbunden, aber nicht dasselbe. C# ist eine Programmiersprache, während .NET eine Entwicklungsplattform ist. C# wird verwendet, um Code zu schreiben, in .NETs Intermediate Language (IL) zu kompilieren und von der .NET -Laufzeit (CLR) ausgeführt zu werden.

C#.NET ist immer noch wichtig, da es leistungsstarke Tools und Bibliotheken bietet, die mehrere Anwendungsentwicklung unterstützen. 1) C# kombiniert .NET Framework, um die Entwicklung effizient und bequem zu machen. 2) Mechanismus zum Typensicherheit und Müllsammlung von C#erhöht die Vorteile. 3) .NET bietet eine plattformübergreifende laufende Umgebung und eine reichhaltige APIs, wodurch die Flexibilität der Entwicklung verbessert wird.

C#.NETisversatileforbothwebanddesktopdevelopment.1)Forweb,useASP.NETfordynamicapplications.2)Fordesktop,employWindowsFormsorWPFforrichinterfaces.3)UseXamarinforcross-platformdevelopment,enablingcodesharingacrossWindows,macOS,Linux,andmobiledevices.

C# und .NET passen sich durch kontinuierliche Aktualisierungen und Optimierungen an die Bedürfnisse neuer Technologien an. 1) C# 9.0 und .NET5 Führen Sie den Datensatztyp und die Leistungsoptimierung ein. 2) .NETCORE verbessert die native und containerische Unterstützung von Cloud. 3) ASP.NetCore integriert sich in moderne Webtechnologien. 4) ML.NET unterstützt maschinelles Lernen und künstliche Intelligenz. 5) Asynchrone Programmierung und Best Practices verbessern die Leistung.

C#.NetissoBableFoREenterPrise-Level Applications-WithemicrosoftCosystemDuetoitsStrongtyPing, Richlibrary, Androbustperformance.

Der Programmierungsprozess von C# in .NET enthält die folgenden Schritte: 1) Schreiben von C# Code, 2) Kompilieren in eine mittlere Sprache (IL) und 3), die durch die .NET -Laufzeit (CLR) ausführt. Die Vorteile von C# in .NET sind die moderne Syntax, das leistungsstarke Typsystem und die enge Integration in das .NET -Framework, das für verschiedene Entwicklungsszenarien geeignet ist, von Desktop -Anwendungen bis hin zu Webdiensten.


Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

MinGW – Minimalistisches GNU für Windows
Dieses Projekt wird derzeit auf osdn.net/projects/mingw migriert. Sie können uns dort weiterhin folgen. MinGW: Eine native Windows-Portierung der GNU Compiler Collection (GCC), frei verteilbare Importbibliotheken und Header-Dateien zum Erstellen nativer Windows-Anwendungen, einschließlich Erweiterungen der MSVC-Laufzeit zur Unterstützung der C99-Funktionalität. Die gesamte MinGW-Software kann auf 64-Bit-Windows-Plattformen ausgeführt werden.

Dreamweaver CS6
Visuelle Webentwicklungstools

mPDF
mPDF ist eine PHP-Bibliothek, die PDF-Dateien aus UTF-8-codiertem HTML generieren kann. Der ursprüngliche Autor, Ian Back, hat mPDF geschrieben, um PDF-Dateien „on the fly“ von seiner Website auszugeben und verschiedene Sprachen zu verarbeiten. Es ist langsamer und erzeugt bei der Verwendung von Unicode-Schriftarten größere Dateien als Originalskripte wie HTML2FPDF, unterstützt aber CSS-Stile usw. und verfügt über viele Verbesserungen. Unterstützt fast alle Sprachen, einschließlich RTL (Arabisch und Hebräisch) und CJK (Chinesisch, Japanisch und Koreanisch). Unterstützt verschachtelte Elemente auf Blockebene (wie P, DIV),

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung