|











|
 |
配列とその使い方
|
開発環境: Visual Studio 2003
|
|
|
|
|
|
バイト列への変換の質問が結構あるので、追加しました。(2003/5/31)
|
|
|
(1)
|
|
|
多次元配列
| 配列の宣言 |
実体のない配列の宣言の方法としては、次のようなやり方があります。
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 例外があがることを確認しています。 |
|
|
|
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 [][]は省略することができます。
|
|
|
|
| シンタックス |
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); |
|
|
|
| 説明 |
| メソッドの呼び出し時に、次のように異なるタイプの引数を渡し、params パラメータでobject
配列でまとめて受けるというやり方ができます。このサンプルプログラムでは、実際に次のようなアクセスを行い、受け側のメソッドで、タイプが正しく取れているのか確認しています。 |
| 例 |
UseParams( 1,2, 3.14, "\n\nparams キーワードの使い方", d4);
// 呼び出し時
public static void UseParams(params object[] list)
これで、C/C++ の printf みたいなことができますが、ちょっと気持ち悪いですね。 |
|
|
|
| int → byte[] |
byte [] byteArray = BitConverter.GetBytes(0x1234abcd);
|
| 文字列(SJIS) → byte[] |
| byte [] strArray =
System.Text.Encoding.GetEncoding("shift-jis").GetBytes("ハローWorld"); |
|
|
|
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]);
}
}
}
|
|