C# delegateの簡単な使い方
C#でメソッドを代入して利用することができるdelegateの簡単な使い方を記述してます。
環境
- OS windows10 pro 64bit
- Microsoft Visual Studio Community 2019 Version 16.7.1
基本的な使い方
delegateの基本構文
delegate 戻り値の型 デリゲート型名(引数);
以下は、実際に、delegateを使用してメソッドを実行するまでのサンプルとなります。
using System;
namespace testapp
{
// delegate宣言
delegate void DelegateTest(int val);
class Program
{
static void Main(string[] args)
{
// Showメソッドを変数「dt」に代入する
DelegateTest dt = Show;
// 変数「dt」からShowを呼ぶ
dt(7);
}
static void Show(int num)
{
Console.Write("引数に指定した値は {0} です。\n", num);
}
}
}
実行結果
変数「dt」に代入している箇所を以下のように記述することも可能です。
DelegateTest dt = Show;
別クラスのメソッドも使用可能です。
using System;
namespace testapp
{
// delegate宣言
delegate void DelegateTest(int val);
class Program
{
static void Main(string[] args)
{
// Showメソッドを変数「dt」に代入する
DelegateTest dt = new Test().Show;
// 変数「dt」からShowを呼ぶ
dt(7);
}
}
class Test
{
public void Show(int num)
{
Console.Write("引数に指定した値は {0} です。\n", num);
}
}
}
また、delegateはメソッドを追加することも可能です。
using System;
namespace testapp
{
// delegate宣言
delegate void DelegateTest(int val);
class Program
{
static void Main(string[] args)
{
// Showメソッドを変数「dt」に代入する
DelegateTest dt = new Test().Show1;
// Show2を追加
Test test = new Test();
dt += test.Show2;
// 変数「dt」からShow1とShow2を呼ぶ
dt(7);
}
}
class Test
{
public void Show1(int num)
{
Console.Write("Show1の引数に指定した値は {0} です。\n", num);
}
public void Show2(int num)
{
Console.Write("Show2の引数に指定した値は {0} です。\n", num);
}
}
}
実行結果
削除する場合は、「dt -= test.Show2;」とします。
using System;
namespace testapp
{
// delegate宣言
delegate void DelegateTest(int val);
class Program
{
static void Main(string[] args)
{
// Showメソッドを変数「dt」に代入する
DelegateTest dt = new Test().Show1;
// Show2を追加
Test test = new Test();
dt += test.Show2;
// 変数「dt」からShow1とShow2を呼ぶ
dt(7);
// Show2を削除
dt -= test.Show2;
// 変数「dt」からShow2が削除されているので、Show1のみが実行される
dt(7);
}
}
class Test
{
public void Show1(int num)
{
Console.Write("Show1の引数に指定した値は {0} です。\n", num);
}
public void Show2(int num)
{
Console.Write("Show2の引数に指定した値は {0} です。\n", num);
}
}
}
実行結果
delegateを使用すると条件により、実行するメソッドを変えることができたりします。
using System;
namespace testapp
{
// delegate宣言
public delegate int DelegateTest(int a, int b);
class Program
{
static void Main(string[] args)
{
DelegateTest dt;
int a = 1;
//条件により分岐
if (a == 0) {
dt = TestA;
}
else {
dt = TestB;
}
Console.WriteLine(dt(1, 2));
}
static int TestA(int x, int y)
{
return x + y;
}
static int TestB(int x, int y)
{
return x * y;
}
}
}
実行結果
上記のコードは匿名関数を使用すると以下のように記述することも可能です。
using System;
namespace testapp
{
// delegate宣言
public delegate int DelegateTest(int a, int b);
class Program
{
static void Main(string[] args)
{
DelegateTest dt;
int a = 1;
//条件により分岐
if (a == 0)
{
dt = delegate (int x, int y) { return x + y; }; ;
}
else
{
dt = delegate (int x, int y) { return x * y; }; ;
}
Console.WriteLine(dt(1, 2));
}
}
}
ラムダ式の場合は、以下となります。
using System;
namespace testapp
{
class Program
{
static void Main(string[] args)
{
int a = 1;
Func<int, int, int> func;
//条件により分岐
if (a == 0)
{
func = (x, y) => x + y;
}
else
{
func = (x, y) => x * y;
}
Console.WriteLine(func(1, 2));
}
}
}
-
前の記事
javascript フォーカスを外す 2020.11.27
-
次の記事
Ubuntu20.10にphp8をインストールする 2020.11.27
コメントを書く