.NET委任、イベント、Lambda式
依頼
依頼は何ですか。
依頼は参照タイプ(実はクラスで、MulticastDelegateの特殊なクラスを継承しています).特定のパラメータのリストと戻りタイプを持つメソッドへの参照を示します.
各依頼はInvokeメソッド,BeginInvokeおよびEndInvoke非同期メソッドを提供する
なぜ依頼が必要なのですか?
依頼の使用方法
委任の宣言、インスタンス化、および使用方法
委任の宣言
delegate void Del(string str);
static void Notify(string name)
{
Console.WriteLine($"Notification received for: {name}");
}
インスタンス化依頼
Del del1 = new Del(Notify);
//C# 2.0
Del del2 = Notify;
依頼の呼び出し
del1.Invoke(" ");
del2(" ");
その他の使用依頼
//C# 2.0
Del del3 = delegate(string name)
{ Console.WriteLine($"Notification received for: {name}"); };
//C# 3.0 lambda
Del del4 = name => { Console.WriteLine($"Notification received for: {name}"); };
開発プロセスを簡素化する.NETには、委任タイプのセットが含まれています.
実例
コード:
class Program
{
///
///
///
///
private delegate void KillDelegate(string fullName);
static void Main(string[] args)
{
//
var killWithKnifeDelegate = new KillDelegate(KillWithKnife);
Kill(" ", killWithKnifeDelegate);
var killWithSwordDelegate = new KillDelegate(KillWithSword);
Kill(" ", killWithSwordDelegate);
var killWithAxeDelegate = new KillDelegate(KillWithAxe);
Kill(" ", killWithAxeDelegate);
Console.ReadKey();
}
static void Kill(string fullName, KillDelegate killDelegate)
{
Console.WriteLine($"{fullName} ");
//
killDelegate.Invoke(fullName);
Console.WriteLine($"{fullName} 10 ");
}
static void KillWithKnife(string fullName)
{
Console.WriteLine($"{fullName} ");
}
static void KillWithSword(string fullName)
{
Console.WriteLine($"{fullName} ");
}
static void KillWithAxe(string fullName)
{
Console.WriteLine($"{fullName} ");
}
}
Lambda式
Lambdaって何?
Lambdaは依頼を使うより便利な文法です.
//C# 2.0
Del del3 = delegate(string name)
{ Console.WriteLine($"Notification received for: {name}"); };
//C# 3.0 lambda
Del del4 = name => { Console.WriteLine($"Notification received for: {name}"); };
なぜLambdaが必要なの?
開発プロセスをシンプル化し、パフォーマンスに影響を与えることはありません.
Lambdaの使い方
式lambdaの基本形式:
// lambda , ;
(input-parameters) => expression
ゼロ入力パラメータをカッコで指定します.
Action line = () => Console.WriteLine();
かっこ内の2つ以上の入力パラメータはカンマで区切られます.
Func testForEquality = (x, y) => x == y;
ステートメントlambda
(input-parameters) => { }
文lambdaの主体は任意の数の文を含むことができる.
Action greet = name =>
{
string greeting = $"Hello {name}!";
Console.WriteLine(greeting);
};
greet("World");
// Output:
// Hello World!
匿名委任とlambdaコードを使用します.
public static void Main(string[] args)
{
List list = new List();
for (int i = 1; i <= 100; i++)
{
list.Add(i);
}
//
List result = list.FindAll(
delegate (int no)
{
return (no % 2 == 0);
}
);
foreach (var item in result)
{
Console.WriteLine(item);
}
// Lambda
List result = list.FindAll(i => i % 2 == 0);
foreach (var item in result)
{
Console.WriteLine(item);
}
}
≪イベント|Events|ldap≫
事件は何ですか。
イベントは、主にメッセージまたは通知の伝達に使用される特殊な委任タイプです.イベントはイベントのパブリケーションタイプからのみ呼び出すことができ、イベント送信者を表すオブジェクトとSystemを有するEventHandler依頼に基づいていることが多い.イベントに関するデータを含むEventArgs派生クラス.
委任とイベントはいつ使用しますか?
イベントの使用方法
イベントのパブリッシュ
イベントデータの定義
public class CustomEventArgs : EventArgs
{
public CustomEventArgs(string message)
{
Message = message;
}
public string Message { get; set; }
}
パブリッシュクラス内のイベントの宣言
public delegate void CustomEventHandler(object sender, CustomEventArgs args);
public event CustomEventHandler RaiseCustomEvent;
//
public event EventHandler RaiseCustomEvent;
イベントの購読
イベントハンドラメソッドの定義
void HandleCustomEvent(object sender, CustomEventArgs a)
{
// Do something useful here.
}
(+=)を使用して購読イベントを追加
publisher.RaiseCustomEvent += HandleCustomEvent;
(-=)を使用してイベントの購読を解除
publisher.RaiseCustomEvent -= HandleCustomEvent;
例
using System;
namespace DotNetEvents
{
//
public class CustomEventArgs : EventArgs
{
public CustomEventArgs(string message)
{
Message = message;
}
public string Message { get; set; }
}
//
class Publisher
{
// EventHandler
public event EventHandler RaiseCustomEvent;
public void DoSomething()
{
RaiseCustomEvent(new CustomEventArgs("Event triggered"));
}
}
//
class Subscriber
{
private readonly string _id;
public Subscriber(string id, Publisher pub)
{
_id = id;
//
pub.RaiseCustomEvent += HandleCustomEvent;
}
// 。
void HandleCustomEvent(object sender, CustomEventArgs e)
{
Console.WriteLine($"{_id} received this message: {e.Message}");
}
}
class Program
{
static void Main()
{
var pub = new Publisher();
var sub1 = new Subscriber("sub1", pub);
var sub2 = new Subscriber("sub2", pub);
//
pub.DoSomething();
Console.ReadKey();
}
}
}