.NET開発者のためのブログメディア

C#における配列の戻り値とは?メソッド作成時の注意点を解説
- SE
- C#で配列の戻り値を使用するときのポイントはありますか?
- PM
- 返却する配列の要素数は何個でも構いませんが、メソッド側でnullを返却しないようにするなどの注意点があります。
目次
C#における配列の戻り値について
今回は、C#における配列の戻り値について説明します。C#ではメソッドの戻り値を配列にできます。その際、配列の要素数に決まりはなく、参照渡しで返却されます。
C#における配列の戻り値に興味のある方はぜひご覧ください。
配列の戻り値
C#ではメソッドの戻り値を配列にできます。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class Hello{ public static void Main() { // 配列の返却 int [] array = makeArray(); foreach ( int item in array ) { System.Console.WriteLine(item); } } public static int [] makeArray() { int [] array = { 0, 1, 2 }; return array; } } |
実行結果は以下のようになります。
1 2 3 |
0 1 2 |
このように、C#ではメソッドの戻り値を配列にできます。
配列の要素数は何個でもよい
上記で戻り値を配列にするプログラムを紹介しました。その際、返却する配列の要素数は何個でも構いません。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
using System.Collections.Generic; public class Hello{ public static void Main() { // 配列の返却 int [] array = makeArray(5); foreach ( int item in array ) { System.Console.WriteLine(item); } } public static int [] makeArray(int arraySize) { // 引数チェック if (arraySize <= 0) { return null; } // Listの生成 var list = new List<int>(); for (int i=0; i<arraySize; i++) { list.Add(i); } // 配列にして返却 return list.ToArray(); } } |
実行結果は以下のようになります。
1 2 3 4 5 |
0 1 2 3 4 |
makeArray(5);とすると、要素数5の配列が返却されます。
makeArray(10);とすると、要素数10の配列が返却されます。
このように、返却する配列の要素数は何個でも構いません。
nullを返却しない
先ほどのサンプルプログラムで、makeArray(0);とするとどうなるでしょうか。
実行結果は以下のようになります。
1 |
System.NullReferenceException: Object reference not set to an instance of an object |
NullReferenceExceptionが発生しました。
nullを返却すると、呼び元で例外の考慮が必要になります。メソッド側でnullを返却しないようにすることで、呼び元でのNullReferenceException例外の考慮が不要になります。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
using System.Collections.Generic; public class Hello{ public static void Main() { // 配列の返却 int [] array = makeArray(0); foreach ( int item in array ) { System.Console.WriteLine(item); } } public static int [] makeArray(int arraySize) { // 引数チェック if (arraySize <= 0) { // 空配列の返却 return new int[0]; } // Listの生成 var list = new List<int>(); for (int i=0; i<arraySize; i++) { list.Add(i); } // 配列にして返却 return list.ToArray(); } } |
NullReferenceExceptionは発生しなくなりました。
要素0の配列を返却することで、呼び元でのNullReferenceException例外の考慮が不要になります。C#で配列を返却するメソッドにおいて、nullを返却しないようにしましょう。
配列戻り値は参照渡し
C#では、配列戻り値は参照渡しになります。
それを確かめるための、実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
public class Hello{ public static void Main() { // 配列の返却 int [] retArray; ArrayTest arrayTest = new ArrayTest(); // 配列の返却 retArray = arrayTest.getArray(); // 返却された配列(retArray)の表示 foreach ( int item in retArray ) { System.Console.WriteLine(item); } // 返却された配列の変更 foreach ( int item in retArray ) { retArray[item] += 10; } // retArrayの表示 foreach ( int item in retArray ) { System.Console.WriteLine(item); } // ArrayTestクラスの配列を表示 arrayTest.printArray(); } } class ArrayTest{ int [] array; public ArrayTest() { array = new int [5] { 0, 1, 2, 3, 4 }; } public int [] getArray() { return array; } public void printArray() { foreach ( int item in array ) { System.Console.WriteLine(item); } } } |
実行結果は以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
0 1 2 3 4 10 11 12 13 14 10 11 12 13 14 |
ArrayTestクラスから配列を返却し、戻り値の配列を変更した後にArrayTestクラスの配列を参照しています。
この結果から、C#での配列戻り値は参照渡しであることが分かります。
配列戻り値の値渡し
C#において、配列の戻り値を値渡しにするにはどうすればよいでしょうか。配列の戻り値をディープコピーすることで、値渡しが実現できます。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
public class Hello{ public static void Main() { // 配列の返却 int [] retArray; ArrayTest arrayTest = new ArrayTest(); // 配列の返却 retArray = arrayTest.getArray(); // 値渡しを実現するためにDeepCopy int [] cpArray = new int [retArray.Length]; System.Array.Copy(retArray, cpArray, retArray.Length); // cpArrayの表示 foreach ( int item in cpArray ) { System.Console.WriteLine(item); } // cpArrayの変更 foreach ( int item in cpArray ) { cpArray[item] += 10; } // cpArrayの表示 foreach ( int item in cpArray ) { System.Console.WriteLine(item); } // ArrayTestクラスの配列を表示 arrayTest.printArray(); } } class ArrayTest{ int [] array; public ArrayTest() { array = new int [5] { 0, 1, 2, 3, 4 }; } public int [] getArray() { return array; } public void printArray() { foreach ( int item in array ) { System.Console.WriteLine(item); } } } |
実行結果は以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
0 1 2 3 4 10 11 12 13 14 0 1 2 3 4 |
DeepCopyには様々な方法がありますが、今回はSystem.Array.Copyを使用しました。このように、配列の戻り値をディープコピーすることで、値渡しが実現できます。
- SE
- 配列の戻り値を値渡しにするには配列の戻り値をディープコピーすることで、値渡しが実現できるのですね。
- PM
- はい。そのとおりです。実際のソースコードを参考にして、自分でもソースコードを書いてみましょう。
C#のソースコードを書いてみよう
C#ではメソッドの戻り値を配列にできます。その際、配列の要素数に決まりはなく、参照渡しで返却されます。
ぜひご自身でC#のソースコードを書いて、理解を深めてください。