C#における配列の戻り値とは?メソッド作成時の注意点を解説

- システム
エンジニア - C#で配列の戻り値を使用するときのポイントはありますか?
- プロジェクト
マネージャー - 返却する配列の要素数は何個でも構いませんが、メソッド側で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を使用しました。このように、配列の戻り値をディープコピーすることで、値渡しが実現できます。
- システム
エンジニア - 配列の戻り値を値渡しにするには配列の戻り値をディープコピーすることで、値渡しが実現できるのですね。
- プロジェクト
マネージャー - はい。そのとおりです。実際のソースコードを参考にして、自分でもソースコードを書いてみましょう。
C#のソースコードを書いてみよう
C#ではメソッドの戻り値を配列にできます。その際、配列の要素数に決まりはなく、参照渡しで返却されます。
ぜひご自身でC#のソースコードを書いて、理解を深めてください。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社夢真ビーネックスグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


C#新着案件New Job
-
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(新宿駅) -
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(新宿駅) -
デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円神奈川県横浜市(桜木町駅) -
デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円神奈川県横浜市(桜木町駅) -
基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(西新宿駅) -
基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(西新宿駅)