Pour cloner un objet, il suffit d'implémenter l'interface ICloneable et sa méthode Clone ().
Il est possible de cloner de manière partielle (shallow clone) ou de manière complète (deep clone).
Dans un Shallow clone, seuls les objets de niveau suppérieur sont clonés, les autres contiennent des références. Pour cela utiliser la méthode MemberwiseClone()
Pour la méthode deep clone il vous faudra implémenter vous même IDisposable
Pour la méthode Shallow, voici une petit exemple très basique
public class Person : ICloneable
{
private string _firstName = "";
private string _surName = "";
private int? _age = null;
public Person() { }
public Person(string surName, string firstName, int? age)
{
_firstName = firstName;
_surName = surName;
_age = age;
}
public string FirstName
{
get { return _firstName; }
set { _firstName = value; }
}
public string SurName
{
get { return _surName; }
set { _surName = value; }
}
public int? Age
{
get { return _age == null ? 0 : _age; }
set { _age = value; }
}
public Object Clone()
{
return this.MemberwiseClone();
}
}
un exemple d'exécution:
Person p1 = new Person("Schouveller", "Michael", 28);
Person p2 = null;
Person p3 = null;
Console.WriteLine("P1: Firstname = {0} Surname = {1} Age = {2}", p1.FirstName, p1.SurName, p1.Age.ToString());
p2 = p1;
p2.Age = 33;
p3 = (Person)p1.Clone();
p3.Age = 50;
Console.WriteLine("P1: Firstname = {0} Surname = {1} Age = {2}", p1.FirstName, p1.SurName, p1.Age.ToString());
Console.WriteLine("P2: Firstname = {0} Surname = {1} Age = {2}", p2.FirstName, p2.SurName, p2.Age.ToString());
Console.WriteLine("P1: Firstname = {0} Surname = {1} Age = {2}", p1.FirstName, p1.SurName, p1.Age.ToString());
Console.WriteLine("P3: Firstname = {0} Surname = {1} Age = {2}", p3.FirstName, p3.SurName, p3.Age.ToString());
Le résultat donne ceci
P1: Firstname = Michael Surname = Schouveller Age = 28
P1: Firstname = Michael Surname = Schouveller Age = 33
P2: Firstname = Michael Surname = Schouveller Age = 33
P1: Firstname = Michael Surname = Schouveller Age = 33
P3: Firstname = Michael Surname = Schouveller Age = 50
Notez que l'age du 3ème P1 vaut toujours 33 et que celui de P3 vaut lui 50.
P3 et P1 n'ont donc plus la même référence