C# Programming

Image配列とその使い方

開発環境: Visual Studio 2003

1.目次

2.目的

バイト列への変換の質問が結構あるので、追加しました。(2003/5/31)

3.参考書

(1) 

4.配列

 

多次元配列

配列の宣言
実体のない配列の宣言の方法としては、次のようなやり方があります。

int [] a1 = null;

このサンプルプログラムでは、まず 配列を int [] a1 = null のように、実体のない形で宣言します。
配列がnullのまま、各要素にアクセスすると、”オブジェクト参照がオブジェクト インスタンスに設定されていません。”というSystem.NullReferenceException 例外があがることを確認しています。
このエラーメッセージはとんでもないですね!いったい、どういうセンスしているんだか!
え?じゃあ、どういうメッセージがいいんだって? ”nullを参照しようとしました"でいいじゃん。
配列の初期化
配列の初期化の方法としては、次のようなやりかたがあります。

int[] b1 = new int[4];
int[,] b2 = new int[2,3];

int[] b1 = new int[4];
int[,] b2 = new int[2,3];

int[] c1 = new int[5] {1,2,3,4,5};
int[] c2 = new int[ ] {1,2,3,4,5};
int[] c3 = {1,2,3,4,5};

int[,] d4 = { {1,2,3},{4,5,6} };

このサンプルプログラムでは、まず 配列を int [] a1 = null のように、実体のない形で宣言します。
このまま、各要素にアクセスすると、オブジェクト参照がオブジェクト インスタンスに設定されていません。というSystem.NullReferenceException 例外があがることを確認しています。

5.ジャグ配列

C,C++とは違って、配列には、もう1つ Jagged 配列があります。
これは、配列の配列で、異なる長さの配列を配列として構成できます。
C, C++ の配列の書式が、ジャグ配列の書式と同じになっているので、混同しないように注意が必要です。

配列の宣言
実体のない配列の宣言の方法としては、次のようなやり方があります。

int[][] jaggedArray = new int[3][];
jaggedArray[0] = new int[5];
jaggedArray[1] = new int[2];
jaggedArray[2] = new int[4];
配列の初期化
配列の初期化の方法としては、次のようなやりかたがあります。

int[][] jaggedArray = new int[3][];
jaggedArray[0] = new int[] {1,2,3,4,5};
jaggedArray[1] = new int[] {1,2};
jaggedArray[2] = new int[] {1,2,3,4};

次に示すように、宣言時に配列を初期化することもできます。

int[][] myJaggedArray = new int [][] 
                        {
                           new int[] {1,2,3,4,5},
                           new int[] {1,2},
                           new int[] {1,2,3,4}
                        };

最初の new int [][]は省略することができます。

6.foreach()

シンタックス
foreach (type identifier in expression) statement
指定項目 :
type
identifier の型。
identifier
コレクションの要素を表す繰り返し変数。
expression
オブジェクト コレクションまたは配列式。コレクションの要素の型は identifier 型に変換できる型である必要があります。
statement
実行される 1 つ以上の埋め込みステートメント。
int[] c3 = {1,2,3,4,5};

foreach(int i in a3)
Console.WriteLine("{0}", i);


7.params の使い方


説明
メソッドの呼び出し時に、次のように異なるタイプの引数を渡し、params パラメータでobject 配列でまとめて受けるというやり方ができます。このサンプルプログラムでは、実際に次のようなアクセスを行い、受け側のメソッドで、タイプが正しく取れているのか確認しています。
UseParams( 1,2, 3.14, "\n\nparams キーワードの使い方", d4);   // 呼び出し時

public static void UseParams(params object[] list)

これで、C/C++ の printf みたいなことができますが、ちょっと気持ち悪いですね。

8.バイト配列への変換


int → byte[]

byte [] byteArray = BitConverter.GetBytes(0x1234abcd);
文字列(SJIS) → byte[]
byte [] strArray = System.Text.Encoding.GetEncoding("shift-jis").GetBytes("ハローWorld");


9.テスト用ソースコード


using System;
using System.Text;

namespace TestArrays
{
        /// <summary>
        /// Array の概要の説明です。
        /// </summary>
        class Class1
        {
                /// <summary>
                /// アプリケーションのメイン エントリ ポイントです。
                /// </summary>
                [STAThread]
                static void Main(string[] args)
                {
                        int[] a1 = null; 
                        int[,] a2 = null; 
                        int[,,] a3 = null;

                        try 
                        {
                                // null のままアクセスすると、例外があがる。
                                // System.NullReferenceException: 
                                // オブジェクト参照がオブジェクト 
				// インスタンスに設定されていません。
                                foreach(int i in a3) 
                                        Console.WriteLine("{0}", i);
                        }
                        catch(Exception e)
                        {
                                Console.WriteLine("{0}", e);
                        }

                        // 初期化方法
                        int[] b1 = new int[4];
                        int[,] b2 = new int[2,3];

                        int[] c1 = new int[5] {1,2,3,4,5}; 
                        int[] c2 = new int[ ] {1,2,3,4,5};
                        int[] c3 =            {1,2,3,4,5};

                        int[,] d4 = { {1,2,3},{4,5,6} };

                        foreach(int i in d4) 
                        {
                                Console.WriteLine("{0}", i);
                        }

                        // params キーワードの使い方
                        UseParams( 1,2, 3.14, "\n\nparams キーワードの使い方", d4);

            // バイトアレイへの変換
            TestByteArray();

            Console.ReadLine();
                }

                public static void UseParams(params object[] list) 
                {
                        foreach(object o in list)
                                Console.WriteLine("{0}:\t{1}", o.GetType(), o);
                }

        public static void TestByteArray()
        {            
            Console.WriteLine("---------\nbyte array");
            byte [] byteArray = BitConverter.GetBytes(0x1234abcd);
            for(int i = 0; i < byteArray.Length; i++)
                Console.WriteLine("byte [{0}] = {1:x}", i, byteArray[i]);

            Console.WriteLine("---------\nstring array");
            byte [] strArray = 
		Encoding.GetEncoding("shift-jis").GetBytes("ハローWorld");
            for(int i = 0; i < strArray.Length; i++)
                Console.WriteLine("byte [{0}] = {1:x}", i, strArray[i]);
        }
        }
}