C#のデリゲート(委譲、アクション、のFunc、述語)とイベント

I.はじめに

作業の開始時に、代表者およびイベントはやや神秘的な感じ、あなたがそれらを理解するとき、非常に難しいことを感じていないようです。プロジェクト内のデリゲートとイベントの使用は、あなたは、彼が偉大であることがわかります。このブログは自分自身に櫛や手数料やイベントの概要を考えられています。

第二に、コミッション

C#での委任は、C ++は関数ポインタと同等ですが、デリゲートはオブジェクト指向で、安全で、特別なクラスは、もちろん、彼が参照型である、伝送方式を委任するための基準です。

2.1、デリゲート

キーワード「デリゲート」を使用する必要がありますデリゲートを宣言し、インスタンス化し、最初の文委嘱されました。32個のパラメータまで0以上のパラメータ、

形式は次のとおりです。

プライベート デリゲートの 文字列 GetAsString();

デリゲートは、彼のクラスと同じのインスタンスをインスタンス化し、クラスであるが、彼は常に、コンストラクタのパラメータとしてデリゲートメソッドを受け付けます。次のようにデリゲートメソッドを呼び出すには二つの方法があります:

INT I = 10; 
VAR =法新しい新しい getAsString(i.ToStringが);
 //メソッドの呼び出し 
Console.WriteLineを($」法メソッドのメソッド{()} ");
 //メソッド2つのコール 
Console.WriteLineを($" メソッド。起動方法Method.invoke {()}「);

結果:

画像

2.2、アクション

アクションジェネリックデリゲートは、戻り値、許容0-16入ってくるパラメータではありません

アクションはパラメータを意味しないし、委託値を返しません

アクション<整数、文字列>委任の着信パラメータ表現int型、文字列戻り値なし

以前の私たちは、[ log4netのロギングを実現アクションの使用上、中]。以下のような:

 パブリック 静的 ボイドデバッグ(文字列メッセージ、アクションRegistedProperties)
        { 
            RegistedProperties()。
            log.Debug(メッセージ)。
        }

募集:

PFTLog.Debug( " テスト拡張フィールド "、()=> { 
    LogicalThreadContext.Properties [ " LOGTYPE "] =" 拡張フィールドの内容 "; 
});

動作では、コンテンツがアクションで直接実行することができます。

2.3、のFunc

funcがジェネリックデリゲート値、許容0-16入ってくるパラメータを返します

funcが<整数>、引数を表していない委託int型の値を返します。

FUNC <オブジェクト、文字列、整数>パラメータは、着信オブジェクト、文字列が委託int値を返すことを意味します

パブリック 静的 小数 GetTotal(機能< int型整数小数 > FUNC、INT A、INT B)
{ 戻り FUNC(B)
}
    

呼ばれます

VAR合計= GetTotal((A、B)=> { リターン小数)A + B;}、1、2)。
Console.WriteLineを($ " 结果为{合計} ")。

業績

画像

2.4、述語

ブール述語ジェネリックデリゲートの種類を返しますが、渡されたパラメータを受け入れるように

述語<整数>は、引数がint戻りブールデリゲートで表現しました

メソッドを定義します。

パブリック 静的 ブール FindPoints(INT A)
{ 返す > = 60。
}
    

述語デリゲートの定義

述語< int型 >述語= FindPoints。

コール

VARポイント= 新しい INT [] { 
    10、
    50、
    60、
    80、
    100}。
VaRの結果= Array.FindAll(点、述語)。

Console.WriteLineを($ " 结果为{string.Join( ";" 結果)} ");

業績

画像

2.5、マルチキャストデリゲート

フロントだけで、複数のメソッドを含めることができます手数料のメソッドを呼び出す含まれ、この委員会は、マルチキャストデリゲートと呼ばれています。マルチキャスト「+ =」を使用してデリゲートと - 委託二種類の演算子を追加および削除します「+」。

2つのメソッドを定義します

公共の 静的な 無効 MultiplyByTwo(ダブル V)
{ ダブル結果= V * 2; 
    Console.WriteLineを($ " 値によって:{V}; MultiplyByTwo結果結果} { "); 
} 公共の静的な無効広場(ダブル V)
{ ダブル結果V *のV =; "$ Console.WriteLineを値によって;広場結果結果} {{V} "); 
}
    
  
    

次に呼び出します

アクション< ダブル >オペレーション= MultiplyByTwo。
操作(1)。
操作+ =スクエア。
操作(2)。

結果:

画像

第三に、イベント

イベントは、イベントを宣言、パブリッシュ/サブスクライブのメカニズムを提供するために、委員会の主任に基づいてイベントキーワードを使用する必要があります。

パブリッシャー(発行元):また、送信者(送信者)として知られているイベントの発行者が、実際には、自身の状態情報自体を維持する目的で、情報は、状態自体を変更したときに、イベントをトリガーする、およびそのいくつかのイベントサブスクライバに気づきます。

加入者(加入者)も受信器として知られているイベントの関心の目的は、興味を持って、それが自動的にこのコードを実行する、発行者は、イベントをトリガするイベントの後、イベントを登録することができ

送信者を見ていない、それは非常に身近な感じを持っています!急いで最初に忙しく、私たちはイベントやUSE文を見て

システムに異常がある場合は、そのようなシナリオは、タイムリーな管理者に通知する必要は、あります。私たちは、管理者機能を通知するために追加たちのログに記録する必要がありますが、問題は、どのようにそれを管理者に通知するのですか?少なくとも、今知っているではありません。だから我々は、イベントで使用する必要があります。

次のコードを追加し、ログを参照することができる場合は、[知らないlog4netのロギングを達成 ]

//のデリゲート予告宣言
パブリック デリゲートの ボイド NoticeEventHander(文字列メッセージを);
 //メカニズムの下では、通知イベントを確立するために私達を委託
パブリック 静的な イベントを OnNotice NoticeEventHander。

呼ばれます

公共の 静的な 無効デバッグ(文字列メッセージ、アクションRegistedProperties)
{ 
    RegistedProperties(); 
    log.debug(メッセージ); //執行通知 
    .Invoke OnNotice($ "?システムの異常、タイムリーな処理、例外情報を喜ば:{}メッセージ "); 
}
    

コードでは(ここでは、我々はConsole.WriteLineをダイレクトアウト)のメソッドを定義するには、管理者に通知し、シーンを参照

パブリック 静的 ボイドお知らせ(文字メッセージ)
{ 
    Console.WriteLineを($ " 通知メッセージの内容} { "); 
}

登録した後、例外メッセージをトリガするには

//方法レジスタ 
PFTLog.OnNotice + =お知らせ; //レジスタの実施例2 //PFTLog.OnNotice + =新しい新しいPFTLog.NoticeEventHander(通知); 
PFTLog.Debug( " テスト拡張フィールド "、()=> { 
    LogicalThreadContext.Propertiesを【 " LOGTYPE "] =" 拡張フィールドの内容 "; 
});



業績

画像

私はちょうど出版社を定義する必要があり、あなたはどのような方法で購読することができ、それは非常に簡単ではありません。

上記のイベントを理解し、我々はそれが多くの場合、.NETオブジェクトの送信者とのEventArgs電子であると言います

.NET Frameworkは、コーディング標準:

まず、デリゲート型のイベントハンドラの名前は最後にする必要があります

第二、デリゲートプロトタイプ定義:Object型、のEventArgs型(またはのEventArgsから継承):ボイドは、戻り値を有し、2つの入力パラメータを受け付け

第三に、イベントは、イベントハンドラデリゲートは、残りの部分を削除した後に命名されます

第四に、EventArgsののEventArgsの端から継承するタイプ

今、私たちは本の発売記念イベントの例をカスタマイズする必要が

対応するクラスファイルを作成します。画像

コードを公開することによってイベント:

public class BookInfoEventArgs : EventArgs
{
    public BookInfoEventArgs(string bookName)
    {
        BookName = bookName;
    }

    public string BookName { get; set; }

}
public class BookDealer
{
    //泛型委托,定义了两个参数,一个是object sender,第二个是泛型 TEventArgs 的e
    //简化了如下的定义
    //public delegate void NewBookInfoEventHandler(object sender, BookInfoEventArgs e);
    //public event NewBookInfoEventHandler NewBookInfo;
    public event EventHandler<BookInfoEventArgs> NewBookInfo;
    public void NewBook(string bookName)
    {
        RaiseNewBookInfo(bookName);
    }

    public void RaiseNewBookInfo(string bookName)
    {
        NewBookInfo?.Invoke(this, new BookInfoEventArgs(bookName));
    }
}

事件订阅者

public class Consumer
{
    public Consumer(string name)
    {
        Name = name;
    }

    public string Name { get; set; }

    public void NewBookHere(object sender, BookInfoEventArgs e)
    {
        Console.WriteLine($"用户:{Name},收到书名为:{ e.BookName}");
    }
}

事件订阅和取消订阅

VaRのディーラー= 新しい BookDealer(); 
VaRのconsumer1 = 新しい消費者( " 用户のA "); 
dealer.NewBookInfo + = consumer1.NewBookHere。
dealer.NewBook( " book112 "); 


VaRのconsumer2 = 新しい消費者( " 用户のB "); 
dealer.NewBookInfo + = consumer2.NewBookHere。


dealer.NewBook( " book_abc "); 

dealer.NewBookInfo - = consumer1.NewBookHere。


dealer.NewBook( " book_all ");

業績

画像

この例の後、我々は、オブジェクトの送信者パラメータは、イベント・パブリッシャー自身を表して知ることができ、かついるEventArgs eは、監視対象です。深い理解した後、それはとても難しい全く想像力がないということではありません。

IVの概要

ここでは、代表者やイベントについて話している、.NET開発における代表者およびイベントの使用は、依存性および結合層、高い再利用可能なコンポーネントの開発を減らすことができます。

おすすめ

転載: www.cnblogs.com/snailblog/p/11520438.html