수색…


통사론

  • 개체 ICloneable.Clone () {반환 Clone (); } // 사용자 정의 공용 Clone () 함수를 사용하는 인터페이스 메소드의 개인 구현.
  • 공용 Foo Clone () {새 Foo 반환 (this); } // 공용 복제 메소드는 복사 생성자 로직을 활용해야합니다.

비고

CLR 에는 형식 보호되지 않는 메서드 정의 object Clone() 이 필요합니다. 이 동작을 무시하고 포함하는 클래스의 복사본을 반환하는 형식 안전 메서드를 정의하는 것이 일반적입니다.

복제가 얕은 사본인지 깊은 사본인지를 결정하는 것은 작성자의 몫입니다. 참조가 포함 된 변경 불가능한 구조의 경우에는 전체 복사본을 만드는 것이 좋습니다. 클래스 자체가 참조 인 경우에는 얕은 복사본을 구현하는 것이 좋습니다.

참고 : C# 에서 인터페이스 메서드는 위에 표시된 구문을 사용하여 개별적으로 구현할 수 있습니다.

ICloneable을 클래스에서 구현하기

꼬임이있는 클래스에서 ICloneable 을 구현하십시오. 공개 형의 안전 Clone() 공개 해, Clone() object Clone() 비공개로 구현 object Clone() .

public class Person : ICloneable
{
    // Contents of class
    public string Name { get; set; }
    public int Age { get; set; }
    // Constructor
    public Person(string name, int age)
    {
        this.Name=name;
        this.Age=age;
    }
    // Copy Constructor
    public Person(Person other)
    {
        this.Name=other.Name;
        this.Age=other.Age;
    }

    #region ICloneable Members
    // Type safe Clone
    public Person Clone() { return new Person(this); }
    // ICloneable implementation
    object ICloneable.Clone()
    {
        return Clone();
    }
    #endregion
}

나중에 다음과 같이 사용됩니다.

{
    Person bob=new Person("Bob", 25);
    Person bob_clone=bob.Clone();
    Debug.Assert(bob_clone.Name==bob.Name);

    bob.Age=56;
    Debug.Assert(bob.Age!=bob.Age);
}

bob 의 나이를 bob_clone 의 나이는 변경되지 않습니다. 이는 디자인에서 (참조) 변수를 지정하는 대신 복제를 사용하기 때문입니다.

구조체에 ICloneable 구현하기

구조체는 할당 연산자 = 사용하여 구성원 단위로 복사하기 때문에 일반적으로 구조체에 대한 ICloneable 구현은 필요하지 않습니다. 그러나 디자인은 ICloneable 에서 상속 한 다른 인터페이스를 구현해야 할 수도 있습니다.

또 다른 이유는 구조체에 복사가 필요한 참조 유형 (또는 배열)이 포함되어있는 경우입니다.

// Structs are recommended to be immutable objects
[ImmutableObject(true)]
public struct Person : ICloneable
{
    // Contents of class
    public string Name { get; private set; }
    public int Age { get; private set; }
    // Constructor
    public Person(string name, int age)
    {
        this.Name=name;
        this.Age=age;
    }
    // Copy Constructor
    public Person(Person other)
    {
        // The assignment operator copies all members
        this=other;
    }

    #region ICloneable Members
    // Type safe Clone
    public Person Clone() { return new Person(this); }
    // ICloneable implementation
    object ICloneable.Clone()
    {
        return Clone();
    }
    #endregion
}

나중에 다음과 같이 사용됩니다.

static void Main(string[] args)
{
    Person bob=new Person("Bob", 25);
    Person bob_clone=bob.Clone();
    Debug.Assert(bob_clone.Name==bob.Name);
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow