ホームページ  >  記事  >  バックエンド開発  >  .NET Framework-Cloneについて詳しく紹介してください

.NET Framework-Cloneについて詳しく紹介してください

黄舟
黄舟オリジナル
2017-03-18 13:16:531726ブラウズ

.NET には、IClonable インターフェイスを実装するオブジェクトが多数あります。つまり、ArrayList オブジェクト (データ構造 3: ArrayList を記述するには C# を使用します) などのコピー関数を実装したり、独自の IClonable インターフェイス オブジェクト。

ArrayList の Clone メソッドの概要をご覧ください:

System.Collections.ArrayList の浅いコピーを作成します。

msdn で確認したところ、浅いコピーの概念に非常に興味があります。説明が少しわかりにくいです。コレクションの浅いコピーとは、要素が値型であるかどうかに関係なく、コレクションの要素をコピーすることだけを指します。または reference 型ですが、Clone はコピーしません。オブジェクト (参照が指すオブジェクト) がコピーされます。新しく複製されたコレクションでは、参照は依然として同じオブジェクト (元のコレクションの参照が指すオブジェクト) を指します。

コレクションの浅いコピーは、参照型であるか値型であるかに関係なく、コレクションの要素のみをコピーしますが、新しいコレクション内の参照が同じオブジェクトを指しているオブジェクトはコピーしません。 that thereferences in theoriginal collection point to.

Cloneで実装されるいわゆる浅いコピーを一言で言うと、Cloneで生成されたオブジェクトは値の型と参照をコピーしますが、参照オブジェクトはコピーしません。この時点で、参照オブジェクトがコピーされないということは何を意味するのか、疑問に思うかもしれません。この問題は、以下のコードを参照してください。

        //人员对象模型
        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;
            }
        }
新しい ArrayList オブジェクトを作成し、それを参照オブジェクトと値型データとしてそれぞれ追加します

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

Clone インターフェイスを使用して、arr1 の浅いテーブルを複製します。コピー:

ArrayList cloneArr1 = arr1.Clone() as ArrayList;

図に示すように:



.NET Framework-Cloneについて詳しく紹介してください
クローンインスタンス cloneArr1 がコピーした内容を個別にテストして、値の型と参照型のコピーをそれぞれ確認します。まず、値の型のコピーを見てみましょう:

cloneArr1[1]=6;
初期セット arr1[1] の要素が変更されているかどうかを確認してみましょう。

は変更されていません
、値はまだ5です。これは、Cloneの後、値の型もコピーされてメモリスタックに配置されることを示しています。 参照型がメモリ ヒープから領域を再度開き、シャオミンの連絡先を変更したかどうかを確認します - 電話番号:

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

この時点で、初期セット arr1 のシャオミンの連絡先情報が変更されているかどうかを再度確認します。

回答: 最新の 170444455555 と一致するように変更されました。

これは、参照型の場合、シャロー コピー コピーはメモリ ヒープ内のメモリ空間を再度開かずに参照のみをコピーすることを示しています。 (メモリ ヒープとメモリ スタックの概念がよくわからない場合は、私の要約を参照してください: C#.NET: メモリ管理のストーリー - 変数の作成と破棄)。

この時点で、クローンの機能について新たに理解しました。浅いコピー、参照型はオブジェクトではなく参照のみをコピーします。 !

では、ディープコピーを実現したい場合、つまり、新しくコピーするオブジェクトが単なる参照のコピーではなく、オブジェクトのコピーである場合はどうすればよいでしょうか!たとえば、テンプレートに基づいて 5 つのバージョンの作成を変更する必要があり、各バージョンは別の会社に配信され、バージョン 1 は会社 A に配信され、バージョン 2 は会社 B に配信されます。 。 。これら 5 つのバージョンの違いは「○○社への入社を希望しています」だけであり、○○社は対応する 5 社の名前に置き換えられるとします。

以上が.NET Framework-Cloneについて詳しく紹介してくださいの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。