配列のコピー

short 型の二次元配列を例に、コピーの説明です。

前田稔(Maeda Minoru)の超初心者のプログラム入門

単純に代入

  1. 配列(Array) は Object Class なので、単純に代入することが出来ます。
    short 型の二次元配列 a1 を a2 に代入してみました。
    /***************************/
    /* 配列のコピー    前田 稔 */
    /***************************/
    using System;
    
    class Prog
    {
        public static void Main()
        {
            short[,]    a1 = new short[2, 3] { {1,2,3}, {11,12,13} };
            short[,]    a2;
            int i,j;
    
            a2 = a1;
            for(i=0; i<2; i++)
                for(j=0; j<3; j++)
                    Console.WriteLine(a2[i,j]);
    
            a2[0,1] = 0;        // a1[0,1] も変わる
            for(i=0; i<2; i++)
                for(j=0; j<3; j++)
                    Console.WriteLine(a1[i,j]);
                    
            Console.ReadLine();
        }
    }
    
  2. このとき注意しなければならないことは、a1 も a2 も同じ領域を指すので「a2 が変われば a1 も変わる」ことです。
    上記のプログラムでは a1 をコピーした a2[0,1] の値に 0 を格納していますが、a1[0,1] の値も変わります。

Clone を作成

  1. 同じ値を持つ別の領域を作成するときは Clone を使います。
    /***************************/
    /* 配列のコピー    前田 稔 */
    /***************************/
    using System;
    
    class Prog
    {
        public static void Main()
        {
            short[,]    a1 = new short[2, 3] { {1,2,3}, {11,12,13} };
            short[,]    a2;
            int i,j;
    
            a2 = (short[,])a1.Clone();
            for(i=0; i<2; i++)
                for(j=0; j<3; j++)
                    Console.WriteLine(a2[i,j]);
    
            a2[0,1] = 0;        // a1[0,1] は元のまま
            for(i=0; i<2; i++)
                for(j=0; j<3; j++)
                    Console.WriteLine(a1[i,j]);
                    
            Console.ReadLine();
        }
    }
    
  2. 同じようなプログラムでも、Clone を使うと a2 の値を変えても a1 が変わらないことに注目して下さい。

超初心者のプログラム入門(C# Frame Work)