こんにちは、リバティエンジニア[?]のFUNAです。 現役エンジニアとしてアプリケーション開発やWeb制作、SEOやブログ運営をしています。
今回はC#における「デリゲート」について学習していきましょう!
「デリゲート」と聞くと、「難しい。」や「今まで何となくで乗り越えてきた。」という方が意外と多くいるのではないでしょうか?
そんな難しいイメージの「デリゲート」を今日でマスターしましょう!
デリゲート(delegate)とは
デリゲート (delegate) とは、C言語などでいうところの「関数ポインタ」のようなものなんです。
デリゲートは関数ポインタと同様で、
ということだけ定義しておき、 メソッドの実体を実行時にセットすることができるものなんです。
どうしてこんな回りくどいことをするのでしょうか?
それは、「こんな型のメソッドを呼び出したい」ということだけ定義しておくと、メソッドの実体はあとでセットすることができます。
このようにしたほうが都合が良い場合がよくあるからなんです。
サンプルコード
文章で説明してもよくわかりませんよね。
私も、ながなが理論を説明されるよりも「早く実行させて!」というタイプなので、さっそくサンプルコードを紹介するので、実際に自分の環境で試してみてください!
using System;
namespace DelegateTest
{
class SampleClass
{
// デリゲートの宣言
public delegate void TestDelegate();
public TestDelegate testDelegateMethode;
public void Test()
{
if (testDelegateMethode != null)
{
testDelegateMethode();
}
}
}
}
このようなDelegateTestというクラスがあったとします。
このクラスでは、デリゲートの宣言をおこなっています。
次に、このデリゲートを宣言しているクラスを使ってみましょう。
using System;
namespace SampleProgram
{
class Program
{
static void Main(string[] args)
{
// 先ほど作ったデリゲートテストクラス
DelegateTest writeTest = new DelegateTest();
// デリゲートにメソッドを定義
writeTest.testDelegateMethode = new DelegateTest.TestDelegate(SampleMethode);
// メソッド呼び出し
writeTest.Test();
}
// 実行するメソッド
static void SampleMethode()
{
Console.WriteLine("これがデリゲートで呼ばれたメソッドです。");
}
}
}
これを実行してみてください。
デリゲートのTest()関数を呼び出しましたが、12行目でデリゲートに実行したいメソッドを指定しているので、17行目のSampleMethode()関数が呼ばれています。
今回はpublic delegate void TestDelegate();で引数も戻り値もないメソッドを呼べるように指定しています。
もし引数や戻り値を指定したい場合は、この行の記述を変えることでできますよ。
まとめ
今回は、C#でほとんどの方が躓くといっても過言でもない、「デリゲート(Delegate)」について解説しました。
これはすこしトリッキーな動きをするので、実際に動かしながら学習することをお勧めします!
C#2.0 で追加された「匿名メソッド」とは?
プログラミングはC#だけに限らず、実際にやってみることがとても大事です!なので、文章を読むだけで理解しようとするのは無理があるので、手を動かして一緒に学習していきましょう。