今回はメソッドについてです。
他のプログラミング言語にも似たような関数、ファンクションといったものがありますが、そのへんの違いも説明していきます。
メソッドとは?
メソッドはプログラムで行う処理(コード)を記述するところになります。
C#ではコードは必ずメソッドのブロック内に書きます。他の言語、たとえばPythonやJavaScriptなんかは1行目の先頭からコードを書くことが出来るのですが、C#ではそれはできません。
あとこれはそのうち理解できればいいのですが、
オブジェクト指向でメソッドはオブジェクトの動きを表す部分になります 。
そのためメソッドはクラスの中に定義され、そのクラスのメンバーになります。
この辺が関数と違うところです。
エントリーポイント(Mainメソッド)
エントリーポイント(Mainメソッド)はプログラムが実行されたときに最初に呼び出されるメソッドです。Mainメソッド { } ブロック内の処理が終わるとプログラムが終了します。C#ではこのMainメソッドの中に処理を書いていくことになります。
再利用を目的としたメソッド
メソッドはブロック内 { } に複数の処理(命令)をひとまとめにしたものです。
何度も行うような共通処理はメソッドとしてまとめておき、いろいろな場所から使用します。
プログラミングをしていると同じ処理を何度も書きたいときが結構でてきます。
何回も同じ処理を書くのは面倒ですし、同じ処理を何か所も書いた場合、不具合があって修正するときに書いた場所すべてを直さないといけなくなります。
なので、同じ処理はメソッドとしてひとまとめにしておき、 複数の場所からそのメソッドを呼び出して処理をさせます。
メソッドは与えられたパラメーター(引数)を元に処理を行い結果(戻り値)を返します。このような動きは他のプログラミング言語の関数、ファンクションと似ています。
また、自分で作ったメソッドだけでなく他の人が作ったメソッドを利用することがあります。
これはネットでいい感じのコードを見つけてコピペするというのではく(それもしたりしますが)、複数のメソッドをひとまとめにしたファイル(dllファイル)というのがあり、それを使ってプログラムからメソッドを呼び出し、欲しい結果を取得します。こういうファイルのことをライブラリーといいます。
ライブラリーは「このメソッドは、こういうパラメーターを渡せば、こういう結果が返ってくる」ということさえ分かっていれば、メソッド内でどんな処理をしているのかを意識せずメソッドを使用できるので、自分でコードを書く手間を省くことができます。
C#の数学ライブラリー(System.Math)にMaxというメソッドがあります。これは2つの数字を渡すと数の大きい方を返してくれるメソッドです。
これがわかっていれば、自分でどっちが大きいか比較する処理を書かなくてもメソッドを呼び出すだけで最大値が求められます。
class Program
{
public static void Main()
{
int max_value = System.Math.Max(20, 10);
System.Console.WriteLine(max_value); // 20
}
}
長くなってしまいましたが、メソッドの使い方を説明していきます。
メソッドの定義
メソッド定義の構文はこんな感じです。
アクセスレベル 戻り値の型 メソッド名(引数) {
// ここに処理を記述する
}
アクセスレベル(アクセシビリティ)
アクセスレベルはそのメソッドがどこからアクセスできるかを指定します。
public、privateなどがあります。
publicはどこからでもアクセスが可能です、先ほど出たライブラリーのメソッドもpublicが指定されているものが自分のプログラムで使うことができます。
privateはそのメソッドが定義されているクラス内からのみアクセスができます。
省略することもでき、その場合は private が設定されます。
戻り値の型
戻り値の型はメソッドの処理結果として返す値のデータ型を指定します。
値を返さないメソッドもあり、その場合はvoidを指定します。
値を返すときはブロック { } 内でreturnキーワードを使います。
returnの後ろに戻り値として返す値や変数を指定します。これは定義で指定した型のデータを指定する必要があります。
class Program
{
static int Method()
{
return 100; // 戻り値の指定
}
static void Main(string[] args)
{
// 戻り値と同じ型の変数を定義して結果を受けとる
int number = Method();
}
}
メソッド名
メソッド名は任意の名前です。
引数
引数はメソッドが処理を行うのに必要なパラメータを ( ) の中に指定します。
構文は、「データ型 引数名」という感じです。
複数のパラメータが必要な場合はカンマ , で区切って指定します。
引数を必要としない場合は ( ) の中は空にします。
// 「引数なし、戻り値なし」メソッド
public void Method1() { }
// 「引数はint型の変数1つ、戻り値はなし」メソッド
public void Method2(int value1) { }
// 「引数なし、戻り値はint型」メソッド
public int Method3() {
return 100; // 戻り値を返す
}
// 「引数はint型の変数2つ、戻り値はint型」メソッド
public int Method4(int value1, int value2) {
return value1 + value2;
}
引数はそのメソッドのブロック { } 内で変数のように使うことができます。
基本的にメソッド内で引数に値を代入しても呼び出し元で指定した変数に影響はありません。
詳細が気になる人はこちらをご覧ください。
クラスメンバーへのアクセス
メソッドの { } 内から、そのメソッドを持っているクラスのメンバー(変数や他のメソッドなど)を使うことができます。
後で詳しく書きますが、静的メソッドの場合はアクセスできるのは静的メンバーだけになります。
class test
{
// クラスのメンバー(フィールド)
public int p1 { get; set; }
// クラスの静的メンバー(フィールド)
public static int p2 { get; set; }
// 普通のメソッド
public void a()
{
// 普通のメソッドからはどちらのメンバーも使うことができる
var aa = this.p1;
var bb = test.p2;
}
// 静的メソッド
public static void b()
{
// 静的メソッドからは静的メンバーにしか使えない
// var aa = this.p1;
var bb = test.p2;
}
}
{ } ブロックの省略
メソッドの処理が1つだけの場合、{ } ブロックを省略することができます。
その場合、=> を付けます。
void Method() => Console.WriteLine("{ } を省略");
メソッドの使い方
メソッドを使う方法は2つあります。
- クラスのメンバーにメソッドを定義し、インスタンスを作成してメソッドを使う。
- クラスのメンバーに静的メソッドを定義し、動的にインスタンスは作成せずにメソッドを使う。
静的メソッドを呼び出す
静的メソッドとは自分でインスタンスを作成する必要のないメソッドです。
メソッドを定義するときに staticキーワードを付けると静的メソッドになります。
class Program
{
static int sum(int a, int b)
{
return a + b;
}
public static void Main()
{
// メソッドの呼び出し 同じクラス内なのでメソッド名だけで呼び出せる
int number = sum(10, 20);
System.Console.WriteLine(number);
}
}
上のサンプルの場合、sumメソッドを使用しているMainメソッドが同じクラス内にあるのでメソッド名だけで呼び出すことが出来ます。
続いて、違うクラスにある静的メソッドを呼び出す場合です。
class Program
{
public static void Main()
{
int number = Sample.sum(10, 20);
System.Console.WriteLine(number);
}
}
class Sample
{
public static int sum(int a, int b)
{
return a + b;
}
}
使いたい静的メソッドが違うクラスにある場合、「クラス名.メソッド名」で呼び出すことが出来ます。また、クラスの外からのアクセスなので静的メソッドにpublicを付けています。
staticについての説明はこちらの記事にまとめてあります。
インスタンスを作成してメソッドを呼び出す
クラスのインスタンスを作成してメソッドを呼び出すのはこんな手順になります。
1.使いたいメソッドを持っているクラスを使える状態にする(クラスのインスタンスを作成)。
2.使えるようになったクラスのメソッドを呼び出す。
「クラスを使える状態にする」の詳しい説明はクラスについての記事のクラスの使い方部分を見てください。
ちょっと長いですが、サンプルコードです。
using System;
namespace test
{
class SampleClass {
// 「引数なし、戻り値なし」メソッド
public void Method1()
{
System.Console.WriteLine("メソッド1の処理が実行されました");
}
// 「引数;int型の変数1つ、戻り値はなし」メソッド
public void Method2(int value1)
{
System.Console.WriteLine("メソッド2の処理が実行されました");
System.Console.WriteLine($"引数の値は[{value1}]です。");
}
// 「引数なし、戻り値はint型」メソッド
public int Method3() {
System.Console.WriteLine("メソッド3の処理が実行されました");
return 100; // 戻り値を返す
}
// 「引数はint型の変数2つ、戻り値はint型」メソッド
public int Method4(int value1, int value2) {
System.Console.WriteLine("メソッド4の処理が実行されました");
System.Console.WriteLine($"引数の値は[{value1}, {value2}]です。");
return value1 + value2;
}
}
class Program
{
static void Main(string[] args)
{
//newでsampleを使えるようにする
SampleClass sample = new SampleClass();
//それぞれメソッドを呼び出す
sample.Method1();
sample.Method2(10);
int a = sample.Method3();
System.Console.WriteLine($"メソッド3の戻り値は[{a}]です");
int b = sample.Method4(10, 30);
System.Console.WriteLine($"メソッド4の戻り値は[{b}]です");
}
}
}
サンプルコードを実行した出力結果はこんな感じです。
メソッド1の処理が実行されました
メソッド2の処理が実行されました
引数の値は[10]です。
メソッド3の処理が実行されました
メソッド3の戻り値は[100]です
メソッド4の処理が実行されました
引数の値は[10, 30]です。
メソッド4の戻り値は[40]です
サンプルコードの説明です。
4~29行目はメソッドを持ったクラスを定義しています。
36行目でクラスを使用する準備をしています。newというキーワードを使ってオブジェクトを作成しクラスを使用できる状態にしています。
SampleClass型の変数sampleにオブジェクトを作成して代入しています。
39行目はMethod1を呼び出しています。
呼び出すには変数の後ろにドット.をつけてメソッド名を書き、( ) で引数を指定します。
クラス型の変数.メソッド名(引数)
引数がないメソッドの場合、( ) の中には何も指定しません。
40行目はMethod2を呼び出しています 。
引数を必要するメソッドは ( ) の中に引数の型にあった変数や値を指定します。
42行目はMethod3を呼び出しています。
Method3はint型の戻り値を返すので、その値を変数aに代入しています。
43行目はMethod3の戻り値を表示しています。
45行目はMethod4を呼び出しています。
Method4は引数を2つ必要とするので、( ) の中にカンマ, で区切って引数を2つ指定します。
46行目はMethod4の戻り値を表示しています。
C# 記事まとめページに戻る(他のサンプルコードもこちら)
コメント