C#のメソッドをもう一歩進めよう!配列やクラスを引数・戻り値に使う方法
これまで、intやstringなどの値を使って、メソッドの基本を学習してきました。
今回は、もう少し発展させて、次の内容を学びます。
- 配列を引数として受け取る
- 配列を戻り値として返す
- クラスから作ったオブジェクトを引数として受け取る
- クラスから作ったオブジェクトを戻り値として返す
難しそうに見えるかもしれませんが、メソッドの基本的な仕組みは変わりません。
最初にメソッドを短く復習しよう
まずは、次のメソッドを確認してみましょう。
static int Add(int a, int b)
{
return a + b;
}
このメソッドを呼び出すコードは、次のようになります。
int answer = Add(10, 20);
Console.WriteLine(answer);
実行結果は30です。コードの役割を整理すると、staticは今回はMainからそのまま呼び出すため、最初のintは戻り値の型、Addはメソッド名、int aとint bは引数、returnは結果を呼び出し元へ返すために使います。
値を受け取る
↓
メソッドの中で処理する
↓
結果を返す
すでにメソッドを理解している人は、この復習を確認したら次へ進みましょう。
引数と戻り値を見つける練習
static double GetAverage(int[] scores)
{
// 平均点を求める処理
}
このメソッド名はGetAverage、引数の型はint[]、引数名はscores、戻り値の型はdoubleです。つまり、int型の配列を受け取り、計算結果をdouble型で返すメソッドです。
引数にはさまざまな型を指定できる
メソッドの引数に指定できるのは、intやstringのような一つの値だけではありません。配列や、クラスから作ったオブジェクトも引数にできます。
配列を引数として渡してみよう
5人分の点数を合計するメソッドを考えてみましょう。
static int GetTotal(int[] scores)
{
int total = 0;
foreach (int score in scores)
{
total += score;
}
return total;
}
引数のint[] scoresは、int型の配列を受け取ることを表しています。呼び出す側では、配列を作ってからメソッドへ渡します。
int[] scores = { 80, 70, 90, 60, 100 };
int total = GetTotal(scores);
Console.WriteLine($"合計点は{total}点です");
実行結果は「合計点は400点です」です。配列を作る、メソッドへ渡す、foreachで合計する、returnで返す、返された値を変数へ代入する、という順に処理されます。
一つの値を渡す場合との違い
static int DoubleNumber(int number)
static int GetTotal(int[] scores)
違うのは引数の型です。DoubleNumberは一つの整数を受け取り、GetTotalは複数の整数が入った配列を受け取ります。引数の型が変わっても、呼び出し元から値を受け取り、その値を使って処理するという基本は同じです。
配列から平均点を求めてみよう
static double GetAverage(int[] scores)
{
int total = 0;
foreach (int score in scores)
{
total += score;
}
double average = (double)total / scores.Length;
return average;
}
int[] scores = { 80, 70, 90, 60, 100 };
double average = GetAverage(scores);
Console.WriteLine($"平均点は{average}点です");
この例では(double)を付けることで、小数を含む平均値も正しく計算できるようにしています。
配列を戻り値として返すこともできる
static int[] CreateScores()
{
int[] scores = { 80, 70, 90 };
return scores;
}
int[] scores = CreateScores();
foreach (int score in scores)
{
Console.WriteLine(score);
}
メソッドの先頭がint[]になっているため、このメソッドはint型の配列を返します。
クラス型を引数として使ってみよう
次のようなStudentクラスを用意します。
class Student
{
public string Name;
public int Score;
}
Studentクラスは、生徒の名前と点数をまとめて扱うための設計図です。次に、Student型のオブジェクトを受け取るメソッドを作ります。
static void ShowStudent(Student student)
{
Console.WriteLine($"{student.Name}:{student.Score}点");
}
Student student1 = new Student();
student1.Name = "田中";
student1.Score = 80;
ShowStudent(student1);
引数のStudent studentは、Studentが引数の型、studentがメソッド内で使う引数名です。
なぜオブジェクトを引数にすると便利なのか
名前と点数を別々に渡す方法でも実行できます。しかし、生徒に出席番号や住所などの情報が増えると、引数も増えてしまいます。Studentクラスに情報をまとめておけば、関連する情報を一つのオブジェクトとして渡せます。
クラス型を戻り値として返してみよう
static Student CreateStudent(string name, int score)
{
Student student = new Student();
student.Name = name;
student.Score = score;
return student;
}
Student student1 = CreateStudent("佐藤", 90);
Console.WriteLine(student1.Name);
Console.WriteLine(student1.Score);
戻り値の型がStudentになっている点が重要です。メソッド内で作ったオブジェクトをreturnで返し、呼び出し側の変数に代入しています。
4種類のメソッドを比べてみよう
| メソッド | 引数 | 戻り値 |
|---|---|---|
DoubleNumber | int | int |
GetTotal | int[] | int |
ShowStudent | Student | なし |
CreateStudent | stringとint | Student |
引数や戻り値の型は違いますが、すべてメソッドです。戻り値がない場合はvoidを使います。
練習問題1:メソッドの形を読み取ろう
static int GetHighestScore(int[] scores)
{
int highestScore = scores[0];
foreach (int score in scores)
{
if (score > highestScore)
{
highestScore = score;
}
}
return highestScore;
}
問題:メソッド名、引数の型、戻り値の型、このメソッドの役割を答えてみましょう。
答え:メソッド名はGetHighestScore、引数の型はint[]、戻り値の型はint。点数の配列から最高点を探して返すメソッドです。
練習問題2:基本から確認したい人向け
受け取った整数を3倍にして返すTripleNumberメソッドを作ってみましょう。
static int TripleNumber(int number)
{
return number * 3;
}
練習問題3:配列を使ってみよう
点数の配列を受け取り、60点以上の人数を返すメソッドです。
static int CountPassedStudents(int[] scores)
{
int count = 0;
foreach (int score in scores)
{
if (score >= 60)
{
count++;
}
}
return count;
}
練習問題4:クラスを使ってみよう
Student型のオブジェクトを受け取り、60点以上なら「合格」、60点未満なら「不合格」と表示します。
static void ShowResult(Student student)
{
if (student.Score >= 60)
{
Console.WriteLine($"{student.Name}さんは合格です");
}
else
{
Console.WriteLine($"{student.Name}さんは不合格です");
}
}
まとめ
今回の重要なポイントは、メソッドの引数や戻り値には、さまざまな型を指定できるということです。
intなどの基本的な型を使える- 配列型を使える
- クラス型を使える
- 配列やオブジェクトを戻り値として返せる
引数で必要なものを受け取る
↓
メソッドの中で処理する
↓
必要なら結果を戻り値として返す
新しいメソッドを見たときは、まず「メソッド名はどれか」「引数の型は何か」「戻り値の型は何か」の3点を確認してみましょう。一つずつ確認すると、配列やクラスを使ったメソッドも読み取りやすくなります。





ディスカッション
コメント一覧
まだ、コメントがありません