IClone 커넥터

2377 단어 clone
      
List<int> values = new List<int>() { 1, 2, 3, 4 }; List<int> values2 = new List<int>(); foreach (var val in values) { values2.Add(val); } values2[0] = 99; Console.WriteLine(values[0]); Console.WriteLine(values2[0]);

첫 번째 출력문 출력 1, 두 번째 출력문 출력 99, 기대하는 답안~~
다음 한 소절 더 볼게요.
먼저 Person 클래스를 정의합니다.
class Person 
    {
        public int ID { get; set; }
        public String Name { get; set; }

        public override string ToString()
        {
            return string.Format("{0},{1}", ID, Name);
        }
    }

그리고 나서
List<Person> persons = new List<Person>() { new Person() { ID = 1, Name = "lou" }, new Person() { ID = 2, Name = "chenting" } };
            List<Person> persons2 = new List<Person>();
            foreach (var p in persons) {
                persons2.Add(p);
            }
            persons2[0].ID = 99; persons2[0].Name = "sai";
            Console.WriteLine(persons[0]);
            Console.WriteLine(persons2[0]);
            

첫 번째와 두 번째 모두 99,sai 출력
이 두 가지 상황이 발생한 원인에 관해서는 모두가 다 알고 있을 것이라고 믿는다.
그럼 두 번째 상황이 생기지 않으려면 어떻게 해야 하나요?
답은 간단하다. 퍼슨류가 IClone 인터페이스를 실현하도록 하자.
새로운 Person 클래스
class Person : ICloneable
    {
        public int ID { get; set; }
        public String Name { get; set; }

        public override string ToString()
        {
            return string.Format("{0},{1}", ID, Name);
        }

        public object Clone()
        {
            return new Person() { ID = ID, Name = Name };
        }
    }

그리고 호출할 때.
            foreach (var p in persons) {
                persons2.Add(p.Clone() as Person);
            }

persons2[0].ID = 99; persons2[0].Name = "sai";
            Console.WriteLine(persons[0]);
            Console.WriteLine(persons2[0]);

이렇게 출력할 때
1,lou
99,sai

좋은 웹페이지 즐겨찾기