Sök…


Syntax

  • objekt ICloneable.Clone () {return Clone (); } // Privat implementering av gränssnittsmetod som använder vår anpassade offentliga Clone () -funktion.
  • public Foo Clone () {return new Foo (this); } // Offentlig klonmetod bör använda kopikonstruktörens logik.

Anmärkningar

CLR kräver ett metoddefinitionsobjekt object Clone() som inte är typsäkert. Det är vanligt att åsidosätta detta beteende och definiera en typsäker metod som returnerar en kopia av den innehållande klassen.

Det är upp till upphovsmannen att bestämma om kloning endast innebär en grund kopia eller en djup kopia. För immutable strukturer som innehåller referenser rekommenderas att du gör en djup kopia. För klasser som referenser själva är det antagligen bra att genomföra en ytlig kopia.

OBS: I C# en gränssnittsmetod implementeras privat med syntaxen som visas ovan.

Implementera ICloneable i en klass

Implementera ICloneable i en klass med en vridning. Exponera en säker typ av Clone() och implementera object Clone() privat.

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
}

Senare att användas på följande sätt:

{
    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);
}

Observera att ändring av bob åldern inte förändrar bob_clone . Detta beror på att designen använder kloning istället för att tilldela (referens) variabler.

Implementera ICloneable i en struktur

Implementering av ICloneable för en struktur behövs i allmänhet inte eftersom strukturer gör en kopia av medlemsvisningen med uppdragsoperatören = . Men designen kan kräva implementering av ett annat gränssnitt som ärver från ICloneable .

Ett annat skäl skulle vara om strukturen innehåller en referenstyp (eller en matris) som också behöver kopieras.

// 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
}

Senare att användas på följande sätt:

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow