Maison  >  Article  >  développement back-end  >  .NET Framework-Clone, veuillez le présenter en détail

.NET Framework-Clone, veuillez le présenter en détail

黄舟
黄舟original
2017-03-18 13:16:531744parcourir

Il existe de nombreux objets dans .NET qui implémentent l'interface IClonable, ce qui signifie qu'ils peuvent implémenter la fonction de copie, comme l'objet ArrayList (en utilisant C# Décrivez la structure de données 3 : ArrayList), ou écrivez votre propre objet qui implémente l'interface IClonable.

Consultez l'introduction de la méthode Clone dans ArrayList :

Créez une copie superficielle de System.Collections.ArrayList.

Je suis très curieux du concept de copie superficielle. Après l'avoir vérifié sur msdn, l'explication est un peu obscure. La copie superficielle d'une collection fait référence à la copie uniquement des éléments de la collection, qu'ils soient ou non. l'élément est un type valeur ou un type Référence , mais Clone ne copie pas l'objet (l'objet pointé par la référence). Dans la collection nouvellement clonée, la référence pointe toujours vers le même objet (l'objet pointé par la référence dans la collection d'origine).

Une copie superficielle d'une collection copie uniquement les éléments de la collection, qu'il s'agisse de types référence ou de types valeur, mais elle ne copie pas les objets auxquels les références font référence dans le nouveau. collection pointent vers les mêmes objets que ceux vers lesquels pointent les références dans la collection d'origine.

En une phrase, la copie dite superficielle implémentée par Clone, l'objet copié depuis Clone a la valeur Tapez, la référence est copiée mais l'objet de référence n'est pas copié. À ce stade, vous devrez peut-être vous demander : qu'est-ce que cela signifie que l'objet de référence n'est pas copié ? Le problème est mieux expliqué par le code. Veuillez consulter le code suivant,

        //人员对象模型
        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;
            }
        }

Créez un nouvel objet ArrayList et ajoutez-le respectivement en tant qu'objet de référence et données de type valeur

             //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);

Nous utilisons l'interface Clone pour cloner une copie superficielle de arr1 :

ArrayList cloneArr1 = arr1.Clone() as ArrayList;

comme indiqué dans la figure :


.NET Framework-Clone, veuillez le présenter en détail

Testez séparément pour voir ce que l'instance clonée cloneArr1 a copié respectivement. Regardons d'abord la copie des types valeur :
cloneArr1[1]=6;

Vérifions si les éléments de l'ensemble initial arr1[1] ont changé ?
 n'a pas changé et la valeur est toujours 5. Cela montre qu'après le clonage, le type de valeur est également copié et placé sur la pile mémoire.

Vérifiez si le type de référence a été rouvert à partir du tas de mémoire et modifiez le numéro de contact de xiaoming - téléphone :

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

À ce moment, nous vérifions à nouveau, xiaoming in l'ensemble initial arr1 Les coordonnées ont-elles changé ?
Réponse : Modifié, conforme au dernier 170444455555.
Cela montre que pour les types référence, la copie superficielle copie uniquement la référence sans réallouer de l'espace mémoire dans le tas de mémoire. (Si vous n'êtes pas très clair sur les concepts de tas de mémoire et de pile de mémoire, veuillez vous référer à mon résumé : C#.NET : Création et destruction de variables d'histoire de gestion de la mémoire).

À ce stade, nous avons une nouvelle compréhension de la fonction de Clone ! Copie superficielle, le type référence copie uniquement la référence, pas l'objet. !

Et si je veux réaliser une copie profonde, c'est-à-dire que mon objet nouvellement copié n'est pas seulement une copie de la référence, mais une copie de l'objet ! Par exemple, vous devez modifier la création de 5 versions basées sur un modèle, et chaque version est livrée à une entreprise différente. La version 1 est livrée à l'entreprise A et la version 2 est livrée à l'entreprise B. . . Supposons que la différence entre ces cinq versions soit simplement "J'espère rejoindre telle ou telle entreprise", et telle ou telle est remplacée par les noms correspondant aux cinq sociétés.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn