Heim  >  Artikel  >  Backend-Entwicklung  >  .NET Framework-Clone bitte im Detail vorstellen

.NET Framework-Clone bitte im Detail vorstellen

黄舟
黄舟Original
2017-03-18 13:16:531692Durchsuche

Es gibt viele Objekte in .NET, die die IClonable-Schnittstelle implementieren, was bedeutet, dass sie die Kopierfunktion implementieren können, wie zum Beispiel das ArrayList-Objekt (mit C# Beschreiben Sie Datenstruktur 3: ArrayList) oder schreiben Sie Ihr eigenes Objekt, das die IClonable-Schnittstelle implementiert.

Sehen Sie sich die Einführung zur Clone-Methode in ArrayList an:

Erstellen Sie eine flache Kopie von System.Collections.ArrayList.

Ich bin sehr neugierig auf das Konzept des flachen Kopierens. Nachdem ich es auf msdn überprüft habe, ist die Erklärung etwas unklar. Das flache Kopieren einer Sammlung bezieht sich darauf, nur die Elemente der Sammlung zu kopieren Das Element ist ein Werttyp oder ein Referenztyp , aber Clone kopiert das Objekt (das Objekt, auf das die Referenz zeigt) nicht. In der neu geklonten Sammlung zeigt der Verweis immer noch auf dasselbe Objekt (das Objekt, auf das der Verweis in der ursprünglichen Sammlung verweist).

Eine flache Kopie einer Sammlung kopiert nur die Elemente der Sammlung, unabhängig davon, ob es sich um Referenztypen oder Werttypen handelt, nicht jedoch die Objekte, auf die sich die Referenzen im neuen beziehen Die Sammlung verweist auf dieselben Objekte, auf die die Verweise in der ursprünglichen Sammlung verweisen.

In einem Satz, der sogenannten flachen Kopie, die von Clone implementiert wird, hat das von Clone kopierte -Objekt den Wert Geben Sie ein, die Referenz wird kopiert, aber das Referenzobjekt wird nicht kopiert. Zu diesem Zeitpunkt müssen Sie sich möglicherweise fragen: Was bedeutet es, dass das Referenzobjekt nicht kopiert wird? Das Problem lässt sich am besten durch Code erklären:

        //人员对象模型
        public class Person
        {            public string name { get; set; }            
        public ContactInfo description { get; set; }    

            public Person(string name, ContactInfo description)
            {                this.description = description;                
            this.name = name;
            }
        }        //联系信息对象
        public class ContactInfo
        {            public string address { get; set; }            
        public string telephone { get; set; }            
        public ContactInfo(string address, string telephone)
            {                
            this.address = address;                
            this.telephone = telephone;
            }            
            //跟新电话联系信息
            public void UpdateTelephone(string telephone)
            {                
            this.telephone = telephone;
            }
        }

Erstellen Sie ein neues ArrayList-Objekt und fügen Sie es als Referenzobjekt bzw. als Werttypdaten hinzu

             //ArrayList对象
            ArrayList arr1 = new ArrayList();            
            //Person对象创建,xiaoming引用Person对象
            Person xiaoming = new Person("xiaoming",new ContactInfo("shanghai","18011113333"));            
            //arr1引用xiaoming,这样arr1[0]也引用了Person对象
            arr1.Add(xiaoming);            
            //arr1中添加值类型整形5元素
            arr1.Add(5);

Wir verwenden die Klonschnittstelle, um eine flache Kopie von arr1 zu klonen:

ArrayList cloneArr1 = arr1.Clone() as ArrayList;

, wie in der Abbildung gezeigt:


.NET Framework-Clone bitte im Detail vorstellen

Testen Sie separat, was die geklonte Instanz cloneArr1 kopiert hat. Wir überprüfen das Kopieren von Werttypen bzw. Referenztypen. Schauen wir uns zunächst das Kopieren von Werttypen an:
cloneArr1[1]=6;

Prüfen wir, ob sich die Elemente der Anfangsmenge arr1[1] geändert haben?
 hat sich nicht geändert und der Wert ist immer noch 5. Dies zeigt, dass nach dem Klonen auch der Werttyp kopiert und auf dem Speicherstapel abgelegt wird.

Überprüfen Sie, ob der Referenztyp erneut aus dem Speicherheap geöffnet wurde, und ändern Sie die Kontaktnummer von Xiaoming – Telefon:

 (cloneArr1[0] as Person).description.UpdateTelephone("170444455555");

Zu diesem Zeitpunkt überprüfen wir erneut, Xiaoming meldet sich der anfängliche Satz arr1 Haben sich die Kontaktdaten geändert?
Antwort: Geändert, konsistent mit der neuesten Version 170444455555.
Dies zeigt, dass bei Referenztypen die flache Kopie nur die Referenz kopiert, ohne den Speicherplatz im Speicherheap erneut zu öffnen. (Wenn Sie sich über die Konzepte von Speicherheap und Speicherstapel nicht ganz im Klaren sind, lesen Sie bitte meine Zusammenfassung: C#.NET: Erstellung und Zerstörung von Story-Variablen für die Speicherverwaltung.)

An diesem Punkt haben wir ein neues Verständnis der Funktion von Klonen! Flache Kopie, Referenztyp kopiert nur die Referenz, nicht das Objekt. !

Was ist, wenn ich ein tiefes Kopieren erreichen möchte, das heißt, mein neu kopiertes Objekt ist nicht nur eine Kopie der Referenz, sondern eine Kopie des Objekts? Sie müssen beispielsweise die Erstellung von 5 Versionen basierend auf einer Vorlage ändern und jede Version wird an ein anderes Unternehmen geliefert. Version 1 wird an Unternehmen A geliefert, und Version 2 wird an Unternehmen B geliefert. . . Angenommen, der Unterschied zwischen diesen fünf Versionen besteht nur aus „Ich hoffe, dem und dem Unternehmen beizutreten“ und „so und so“ wird durch die Namen ersetzt, die den fünf Unternehmen entsprechen.

Das obige ist der detaillierte Inhalt von.NET Framework-Clone bitte im Detail vorstellen. 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