Home  |  Delphi .net Home  |  System.Array  |  Clone Method
  
Clone  
Method  
Creates a shallow clone (copy) of the current array to a new array
Array Class
System NameSpace
CF1.  Function Clone : Object;
CF : Methods with this mark are Compact Framework Compatible
Description
The current array is recreated in its entirety as a new array. It has the same dimensions, data type and element values.
 
When the current array holds reference (non primitive) data types, the cloned array element values still refer to the same objects that current array elements refer to. This is what is referred to as a shallow copy. A deep copy would create new versions of the referred objects.
Notes
You must cast the Object output to System.Array when assigning to the target array type.
Microsoft MSDN Links
System
System.Array
 Author links

 Buy Website Traffic at
 Buywebsitetrafficexperts.com

 Buy Proxies at
 Buyproxies.io
 
 
 
Cloning a single dimension string array
program Project1;
{$APPTYPE CONSOLE}

var
  myArray, cloneArray : System.Array;
  i                   : Integer;

begin
  // Create a 3 element single dimension array of strings
  myArray := System.Array.CreateInstance(TypeOf(String), 3);

  // Fill the array with values
  myArray.SetValue('Hello', 0);
  myArray.SetValue('sad', 1);
  myArray.SetValue('World', 2);

  // Clone the array - this carries out a shallow copy
  cloneArray := System.Array(myArray.Clone);

  // Display both arrays
  for i := 0 to myArray.Length-1 do
    Console.WriteLine('myArray[{0}]    = {1}',
                       i.ToString, myArray.GetValue(i));

  Console.WriteLine;

  for i := 0 to cloneArray.Length-1 do
    Console.WriteLine('cloneArray[{0}] = {1}',
                       i.ToString, cloneArray.GetValue(i));

  Console.ReadLine;
end.
   myArray[0]    = Hello
   myArray[1]    = sad
   myArray[2]    = World
  
   cloneArray[0] = Hello
   cloneArray[1] = sad
   cloneArray[2] = World
Illustrating the shallowness of the Clone method
program Project1;
{$APPTYPE CONSOLE}

type
  MyClass = Class
    private
      mcName : String;
    published
      Property Name : String
          read mcName
         write mcName;
      Constructor Create(Name : String); overload;
      Function    ToString : String;     overload;
  end;

// MyClass methods
constructor MyClass.Create(Name : String);
begin
  inherited Create;
  mcName := Name;
end;

function MyClass.ToString : String;
begin
  Result := Name;
end;

// Main code

var
  myObject            : MyClass;
  myArray, cloneArray : System.Array;
  i                   : Integer;

begin
  // Create a 3 element single dimension array of MyClass objects
  myArray := System.Array.CreateInstance(TypeOf(MyClass), 3);

  // Fill the array with values
  myArray.SetValue(MyClass.Create('Hello'), 0);
  myArray.SetValue(MyClass.Create('sad'), 1);
  myArray.SetValue(MyClass.Create('World'), 2);

  // Clone the array - this carries out a shallow copy
  cloneArray := System.Array(myArray.Clone);

  // Display both arrays
  for i := 0 to myArray.Length-1 do  // Arrays are always 0 based
  begin
    myObject := MyClass(myArray.GetValue(i));
    Console.WriteLine('myArray[{0}]    = {1}',
                       i.ToString, myObject.ToString);
  end;

  Console.WriteLine;

  for i := 0 to cloneArray.Length-1 do
  begin
    myObject := MyClass(cloneArray.GetValue(i));
    Console.WriteLine('cloneArray[{0}] = {1}',
                       i.ToString, myObject.ToString);
  end;

  // Demonstrate the shallowness of the clone process
  Console.WriteLine;
  myObject := MyClass(cloneArray.GetValue(1));
  myObject.Name := 'wonderful';  // Was 'sad'
  Console.WriteLine('After updating just the cloneArray :');
  Console.WriteLine;

  // Display both arrays again
  for i := 0 to myArray.Length-1 do
  begin
    myObject := MyClass(myArray.GetValue(i));
    Console.WriteLine('myArray[{0}]    = {1}',
                       i.ToString, myObject.ToString);
  end;

  Console.WriteLine;

  for i := 0 to cloneArray.Length-1 do
  begin
    myObject := MyClass(cloneArray.GetValue(i));
    Console.WriteLine('cloneArray[{0}] = {1}',
                       i.ToString, myObject.ToString);
  end;

  Console.ReadLine;
end.
   myArray[0]    = Hello
   myArray[1]    = sad
   myArray[2]    = World
  
   cloneArray[0] = Hello
   cloneArray[1] = sad
   cloneArray[2] = World
  
   After updating just the cloneArray :
  
   myArray[0]    = Hello
   myArray[1]    = wonderful
   myArray[2]    = World
  
   cloneArray[0] = Hello
   cloneArray[1] = wonderful
   cloneArray[2] = World
 
 
Delphi Programming Neil Moffatt 2002 - 2017. All rights reserved.  |  Contact the author