ICloneable Interface

Overview

  • Enable objects to be cloned.
  • Does not specify if you need to implement deep-copy or shallow-copy. (Problematic in public APIs)

Good practice

Examples

Object Cloning

class MyNumber: ICloneable
{
    private int _x;
 
    public int X
    {
        get { return this._x; }
        set { this._x = value; }
    }
 
    public MyNumber(int x)
    {
        this._x = x;
    }
 
    #region ICloneable Members
    public object Clone()
    {
        return new MyNumber(this.X);
    }
    #endregion
}
MyNumber a = new MyNumber(10);
MyNumber b = (MyNumber)a.Clone();
MyNumber c = a;
a.X += 100; // Incremented to display b.X does not get incremented, while c.X does.
Console.WriteLine(a.X); // Prints 110
Console.WriteLine(b.X); // Prints 10
Console.WriteLine(c.X); // Prints 110