C#のメソッドをもう一歩進めよう!配列やクラスを引数・戻り値に使う方法

広告

これまで、intstringなどの値を使って、メソッドの基本を学習してきました。

今回は、もう少し発展させて、次の内容を学びます。

  • 配列を引数として受け取る
  • 配列を戻り値として返す
  • クラスから作ったオブジェクトを引数として受け取る
  • クラスから作ったオブジェクトを戻り値として返す

難しそうに見えるかもしれませんが、メソッドの基本的な仕組みは変わりません。

最初にメソッドを短く復習しよう

まずは、次のメソッドを確認してみましょう。

static int Add(int a, int b)
{
    return a + b;
}

このメソッドを呼び出すコードは、次のようになります。

int answer = Add(10, 20);
Console.WriteLine(answer);

実行結果は30です。コードの役割を整理すると、staticは今回はMainからそのまま呼び出すため、最初のintは戻り値の型、Addはメソッド名、int aint bは引数、returnは結果を呼び出し元へ返すために使います。

値を受け取る

メソッドの中で処理する

結果を返す

すでにメソッドを理解している人は、この復習を確認したら次へ進みましょう。

引数と戻り値を見つける練習

static double GetAverage(int[] scores)
{
    // 平均点を求める処理
}

このメソッド名はGetAverage、引数の型はint[]、引数名はscores、戻り値の型はdoubleです。つまり、int型の配列を受け取り、計算結果をdouble型で返すメソッドです。

引数にはさまざまな型を指定できる

メソッドの引数に指定できるのは、intstringのような一つの値だけではありません。配列や、クラスから作ったオブジェクトも引数にできます。

配列を引数として渡してみよう

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種類のメソッドを比べてみよう

メソッド引数戻り値
DoubleNumberintint
GetTotalint[]int
ShowStudentStudentなし
CreateStudentstringintStudent

引数や戻り値の型は違いますが、すべてメソッドです。戻り値がない場合は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}さんは不合格です");
    }
}

練習問題2:基本から確認したい人向け

static int TripleNumber(int number)
{
    return number * 3;
}

呼び出し例:

int result = TripleNumber(7);
Console.WriteLine($"3倍した値は{result}です");

実行結果

3倍した値は21です

練習問題3:配列を使ってみよう

static int CountPassedStudents(int[] scores)
{
    int count = 0;

    foreach (int score in scores)
    {
        if (score >= 60)
        {
            count++;
        }
    }

    return count;
}

呼び出し例:

int[] scores = { 80, 55, 60, 40, 90 };
int passedCount = CountPassedStudents(scores);
Console.WriteLine($"合格者数は{passedCount}人です");

実行結果

合格者数は3人です

練習問題4:クラスを使ってみよう

static void ShowResult(Student student)
{
    if (student.Score >= 60)
    {
        Console.WriteLine($"{student.Name}さんは合格です");
    }
    else
    {
        Console.WriteLine($"{student.Name}さんは不合格です");
    }
}

呼び出し例(Studentクラスは記事内のものをそのまま使用):

Student student1 = new Student();
student1.Name = "鈴木";
student1.Score = 55;

ShowResult(student1);

実行結果

鈴木さんは不合格です

まとめ

今回の重要なポイントは、メソッドの引数や戻り値には、さまざまな型を指定できるということです。

  • intなどの基本的な型を使える
  • 配列型を使える
  • クラス型を使える
  • 配列やオブジェクトを戻り値として返せる

引数で必要なものを受け取る

メソッドの中で処理する

必要なら結果を戻り値として返す

新しいメソッドを見たときは、まず「メソッド名はどれか」「引数の型は何か」「戻り値の型は何か」の3点を確認してみましょう。一つずつ確認すると、配列やクラスを使ったメソッドも読み取りやすくなります。

訪問数 36 回, 今日の訪問数 36回

広告

C#,メソッド

Posted by hidepon