Java プログラマのための C# 入門 (#2 配列と文字列)

#1 プリミティブ型と制御構文」 に引き続き、今回は C# の配列についてと文字列について Java との違いをメモしておきます。 参考にしている書籍は 『独習 C#』 です。

C# の配列

1 次元配列

C# の配列に関して、1 次元配列はほとんど Java と大差ないと思ってよいでしょう。

// 1 次元配列の宣言と初期化
int[] vals1 = { 10, 20, 30 };
// 1 次元配列の宣言とメモリ領域確保
int[] vals2 = new int[3];
// Java のようにメモリ領域確保と初期化を同時にすることも可能
val2 = new int[]{ 1, 2, 3 };

#1 の制御構文のところ で述べませんでしたが、配列のようなコレクションの要素を 1 個ずつ扱う際に便利なのが foreach 文です。 Java の拡張 for 文のようなものです。

// vals1 の配列の各要素の値の合計を計算する
long sum = 0;
foreach( int v in vals1 ) {
    sum += v;
}
多次元配列

Java と異なり、C と同じタイプの多次元配列を扱うこともできます。 このとき、C と異なり、1 つの角括弧の中に複数の添え字を入れます。

// 2 次元配列の宣言と初期化
int[,] valss = { { 10, 20 }, { 30, 40 } };
// アクセスは角括弧の中に複数の添え字を書く
Console.WriteLine( valss[0,1] ); //=> 20
// 多次元配列の Length プロパティは全ての要素数を返す
Console.WriteLine( valss.Length ); //=> 4
// foreach では, 全ての要素が小さい行の方から順番に各列の値がイテレーションされる
foreach( int v in valss ) {
    Console.WriteLine( v );
}

// メモリ領域確保
valss = new int[4,4];
// メモリ領域確保と初期化
valss = new int[,]{ { 1, 2 }, { 3, 4 } };
ジャグ配列

Java でいうところの多次元配列 (配列の配列) ももちろん扱えます。 これはジャグ配列 (ジャギ配列?) と呼ばれます。

// ジャグ配列 (配列の配列)
int[][] valsj = new int[10][];
valsj[0] = new int[2];
valsj[1] = new int[4];
// メモリ領域確保と初期化
valsj = new int[][]{
    new int[]{ 1, 2, 3 },
    new int[]{ 4, 5 }
};

文字列

C# の文字列は string クラスのインスタンスです。 Java での文字列の扱いに慣れているとさほど違和感はないと思います。 Java と違っていて注意しないといけないのは、== 演算子は同値性検査を行う、ということです *1

// 文字列 (基本は Java と同じ)
string str = "abcde穴";
string s1 = "abc";
string s2 = "de穴";

Console.WriteLine( str.Length );   //=> 6 (サロゲートペアは長さ 2 でカウントされる)
Console.WriteLine( str[0] );       //=> 'a' (Java でいうところの String#charAt)
Console.WriteLine( str == s1+s2 ); //=> True (Java とは異なり string に対する == 演算子は同値性検査)

// foreach 文で char ごとのイテレーションも可能
foreach( char c in str ) {
    Console.WriteLine(c);
}

Java では char 単位ではなく文字コードポイント単位で文字列を扱うためのメソッドが用意されていますが、C# の場合はどうなんでしょうね。 また調べてみてわかったら追記したいと思います。

*1:文字列に限らない一般的な同値性検査や同一性検査についてはまた改めて書きたいと思います