>  기사  >  백엔드 개발  >  .NET Framework-Clone에 대해 자세히 소개해주세요.

.NET Framework-Clone에 대해 자세히 소개해주세요.

黄舟
黄舟원래의
2017-03-18 13:16:531691검색

.NET에는 IClonable 인터페이스를 구현하는 개체가 많이 있습니다. 이는 ArrayList 개체와 같은 복사 기능을 구현할 수 있음을 의미합니다(C# 사용). 데이터 구조 3: ArrayList)를 설명하거나 IClonable 인터페이스를 구현하는 자체 객체를 작성하세요.

ArrayList의 Clone 메서드 소개 보기:

System.Collections.ArrayList의 단순 복사본을 만듭니다.

msdn에서 확인해보니 설명이 좀 애매하네요. 요소가 값 유형 또는 참조 유형이지만 Clone은 객체(참조가 가리키는 객체)를 복사하지 않습니다. 새로 복제된 컬렉션에서 참조는 여전히 동일한 개체(원래 컬렉션의 참조가 가리키는 개체)를 가리킵니다.

컬렉션의 얕은 복사본은 참조 유형이든 값 유형이든 컬렉션의 요소만 복사하지만 참조가 참조하는 개체는 복사하지 않습니다. 컬렉션은 원본 컬렉션의 참조가 가리키는 것과 동일한 개체를 가리킵니다.

한 문장으로 말하자면 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 객체를 생성하고 이를 각각 참조 객체와 값 유형 데이터로 추가합니다. 인터페이스 복제, arr1의 얕은 복사본을 복제합니다:

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

그림과 같이:



.NET Framework-Clone에 대해 자세히 소개해주세요.
테스트 및 복제 개별적으로 cloneArr1 인스턴스에 의해 복사된 내용은 무엇입니까? 값 유형과 참조 유형의 복사를 각각 확인합니다. 먼저 값 유형 복사를 살펴보겠습니다.

ArrayList cloneArr1 = arr1.Clone() as ArrayList;
초기 세트 arr1[1]의 요소가 변경되었는지 확인합니까?
 

변경되지 않았습니다
, 값은 여전히 ​​5입니다. 이는 Clone 후에 값 유형도 복사되어 메모리 스택에 배치된다는 것을 보여줍니다. 메모리 힙에서 참조 유형이 다시 열렸는지 확인하고 샤오밍의 연락처를 수정합니다. - 전화번호:

cloneArr1[1]=6;

이때 샤오밍의 연락처를 다시 확인하겠습니다. 초기 세트 arr1에서 변경되었나요?

답변: 최신 170444455555와 일치하여 변경되었습니다.

이는 참조 유형의 경우 얕은 복사 복사가 메모리 힙의 메모리 공간을 다시 열지 않고 참조만 복사한다는 것을 보여줍니다. (메모리 힙 및 메모리 스택의 개념이 명확하지 않은 경우 요약: C#.NET: 메모리 관리 스토리-변수 생성 및 소멸을 참조하세요.)

이 시점에서 Clone의 기능에 대한 새로운 이해가 생겼습니다! 얕은 복사, 참조 유형은 객체가 아닌 참조만 복사합니다. !

그렇다면 딥 카피, 즉 새로 복사한 개체가 참조의 복사본이 아니라 개체의 복사본이 되기를 원한다면 어떻게 해야 할까요? 예를 들어, 템플릿을 기반으로 5개의 버전 생성을 수정해야 하는데 각 버전이 다른 회사에 전달됩니다. 버전 1은 A 회사에 전달되고, 버전 2는 B 회사에 전달됩니다. . . 이 다섯 가지 버전의 차이점은 단지 "나는 이러저러한 회사에 입사하고 싶습니다"일 뿐이고, 등등은 해당하는 다섯 회사의 이름으로 대체된다고 가정해 보겠습니다.

위 내용은 .NET Framework-Clone에 대해 자세히 소개해주세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.