デリゲートとラムダ式、アクションとのFunc

1、なぜ委託すべきです

なぜ我々は、手数料を持っていますか?確かに存在して委託する必要があるので、我々が委託する際に使用することができるかを見て、合理的かつ不合理であるものは時間の外に排除されますがあります。

次に我々は、需要を持つメソッドを呼び出すことで、1〜1000の数字が10の倍数であるすべての数字を削除します

パブリック 静的リスト< int型 > GetNum(){ 
    リスト < int型 > LST = 新しい新しいリスト< 整数 > ();
     // これは最も簡単な方法ですが、この例を与えることが最も適している
    ためint型 I = 1。 ;私は< 1000年 ; Iは++ 
    { 
        IF(I%10 == 0 ){ 
            lst.Add(I); 
        } 
    } 
    戻りLSTを; 
}

これはよく書かれていますが、1日あれば、私たちのニーズが変化している、すべての番号1〜1000の数字を削除する8の倍数である、そして我々は、書き方をすべきですか?そこに限り、条件はライン上のI%8 == 0を変えるようではありませんが、ほとんど変化した場合、その後、書き込みの方法が良くないことを証明する方法を変更する方法は非常に複雑である場合、変更することは非常に困難です。一つは、買収は8の倍数を添加する方法であることを主張するかもしれないので、データの冗長性を増加させる、それは重複コンテンツです。

私たちは、限り上を通過するような送達方法(ブールパラメータの型の値を返すメソッドがあるint型である)ことができれば、この問題は問題になることはありません

パブリック 静的リスト< int型 > GetNum(int型のリターン・メソッドのパラメータがブールタイプである){ 
    リスト < int型 > LST = 新しい新しいリスト< int型 > ()
    のためにint型 I = 1。 ;私は< 1000 ; I ++は
    { 
        IF (int型メソッドのパラメータは、ブール値を返す){ 
            lst.Add(I); 
        } 
    } 
    戻りLSTを; 
}

それは我々が取得しないようにしたいと思うものではありません数字の種類に関係なく、呼び出し側は1-1000内の数字を行うことができます得るために何を望むか、呼び出し側に操作します。しかし、この方法の前提は、方法を転送することができます、私たちは委託、この時間を使用する必要があるということです。

デリゲートを使用する方法2、

実際には、メソッドへのポインタを委託することができ、デリゲートの定義は、タイプを定義することです

まずは、デリゲートを定義してみましょう、それはタイプを定義することです

// アクセス修飾子のキーワードデリゲートメソッドの戻り値の型の名前を入力し、定義する(パラメータ1、パラメータ..... 2); 
公共の デリゲート ブール(DelegateFunc int型 X-);

定義された委託、我々が定義されていることを意味するDelegateFuncタイプを使用するように、このタイプの方法およびパブリッククラスDelegateFunc {}型の定義がそうであるように、我々はすべてのタイプであるのでクラスを書いたが、同じですその使用量は、一般的なのは、型の宣言が宣言されている方法を見てみましょう、確かに同じです

// 型変数名= Object型(コンストラクタのパラメータを持っている)のオブジェクトインスタンス化 
オブジェクトOBJ = 新しい新しいオブジェクトを();

DelegateFuncは、我々はまた、タイプを定義しているので、同じ性質を利用(コンストラクタは、パラメータが必要なので、書かれた以下の間違っているので、無入ってくるパラメータ)

// 型変数名= DelegateFuncは(コンストラクタパラメータを持た)型のオブジェクトをインスタンス化 
DelegateFunc FUNC = 新新 DelegateFunc();

メソッドへのポインタを委任することができ、そしてそれは、コンストラクタの方法が必要である、そして我々はあなたがint型メソッドのパラメータを受け取ることができ、戻り値ブールを定義します

// 等価プログラム1 
パブリック 静的ブール条件1(INT I)
{ 
    // シミュレーション複雑な操作が相当I%10 == 0リターンに、
    INT X%I = 10 IF(I%10 == 0 
    { 
        リターン trueに; 
    } 
    そうでは{
         返す falseに; 
    } 
}

さて、型のオブジェクトをインスタンス化する方法を定義してみましょうDelegateFunc

// コンストラクタメソッド、それは(と)(にテープを必要としない)があれば呼び出され 
DelegateFunc FUNC = 新新 DelegateFunc(条件1)。

道の次の文のデリゲートこのタイプでは、次の見

// 同じタイプObject型のもので書くことができる
 // 最終的オブジェクト文字列から継承、及び文字列オブジェクトのデフォルト値に変換することができるので、 
対象物OBJ = OBJを;
 // とDelegateFuncも条件1を示し、このように割り当てることができますデフォルトでは、デリゲート型に変換することができ 
DelegateFunc FUNC =条件1。

完了方法をポイントする条件1 funcを変数をインスタンス化した後、によって呼び出さ

// オブジェクトのメソッド呼び出しとデリゲート型が通常と同じで呼び出し 
FUNC(10)。

そして、私たちはこのように見えるように変更GetNum方法を書かれている、DelegateFuncパラメータの型パラメータを受け取るためには、デリゲート型であります

パブリック 静的リスト< INT > GetNum(DelegateFunc FUNC)
{ 
    リスト < INT > LST = 新しい新しいリスト< 整数 > ()
    のためのINT I = 1 ; Iは< 1000 ; Iは++ 
    { 
        // メソッド呼び出しが呼び出しに応じて、上を通過デジタルオーバーパスを取得するメソッド
        IF (FUNC(I))
        { 
            ; lst.Add(I)
        } 
    } 
    を返すLSTを; 
}

MainメソッドでGetNumメソッドを呼び出します

// デリゲート宣言 
DelegateFunc FUNC = 新新DelegateFunc(条件1)を;
 // メソッドの呼び出し 
<リストをint型 > LST = ; GetNum(FUNC)
 //がデフォルトなので、直接呼び出すことができ、変換
 // 条件1一覧<整数> LST = GetNum( );
 // 出力
のforeachint型の項目LST)
{ 
    Console.WriteLineを(項目); 
}

 

輸出

我々は新しいプログラムを持っている場合は、だけにしてメソッドを渡し、新しいプログラムを作成する必要があり、私達はちょうどそれが未満1から10008の倍数を求めて見るなど、私たちは、新しいプログラムを宣言する必要があります

// 新しいプログラム2宣言
パブリック 静的ブールCONDITION2(int型I){
     // 、同じ操作が複雑==私は戻り0.8%をモデル化することと等価である
    INT X = Iの%。8 ;
     IF(I%で8 == 0 
    { 
        リターン trueに; 
    } 
    {
         リターン falseに; 
    } 
}

そしてちょうど、のような、ライン上の手数料声明、ライン上の着信GetNum。

しかし、我々は、しかし、比較的コードを単純化していますが、書くのはまだ非常に面倒、その後、私たちはラムダ式を見て、見て

3、ラムダ式

最初のラムダ式は執筆のちょうど方法です!メソッドのラムダは匿名メソッドの宣言であり、それが縛られていなかった委託、それは2つのことですが、ラムダ式とデリゲートと一緒に非常に一般的です!

 機能のもう一つの方法であるラムダ式の構文、を見てください

// 書き込むことができる
 // DelegateFunc新しいDelegateFunc FUNC =((I)=>
 // {
 //     リターン8%I == 0;
 // });
 //はデフォルト以来新しいDelegateFuncこの操作ではないかもしれません変換
 // 文の複数の単語場合は、セミコロンで区切られたそれぞれの書き込み 
DelegateFuncがFUNC =(I)=> { 戻り I%を8 == 0 ;};
 // 単一の文がデフォルトreuturnなしリターンを書いた場合、私は8%この== 0計算値 
FUNC =(I)=> I%8。 == 0 ;
 // パラメータのみ複数の場合、(I、J、...)の書き込みに 
FUNC = I = > I%8。 == 0 ;

またラムダ方法ものみ書き込むことができ、一見、宣言するために使用することができる,,,,

// 戻り値なし
公共の 静的な 無効 HelloWord()=> Console.WriteLineを(" こんにちは言葉は!" );
 // 値を返す
パブリック 静的な文字列GetHelloWord()=> " !こんにちはWordを"

lambdは私たちがGetNumを呼ぶことにしましょうと、それは非常に便利になります

// 8複数 
一覧< 整数 > GetNum LST =((I)=> I%8 == 0 );
 // 10の複数 
LST = GetNum(I => I%10 == 0 );
 // 20であります複数 
LST = GetNum(I => I%20である == 0)。

4、アクションとのFunc

アクションとのFunc Microsoftはアクションは戻り値ではありません、とのFuncの値を返すために必要であることを除いて、2つのデリゲート型を定義しています

対処方法

// パラメータなしに 
アクションアクション1 =()=> Console.WriteLineを(" アクション" );
 // 呼び出しパラメータ、そしてアクション<T>は 
アクション< int型 >アクション2 =(I)=> Console.WriteLineを(I);
 //を生活時間のパラメータ<T、T、T>複数の 
アクション< int型文字列 > Action3 =(I、STR)=> Console.WriteLineを(I + " \ T " + STR);
 // 呼び出し
)(アクション1; 
アクション2(10 ); 
Action3(10" S ");

結果:

FUNC使用

// のFuncのFuncタイプだけでなくのFunc <T>型で 
のFunc < ストリング > =関数func1()=> " FUNC " ;
 // もし所望のパラメータのFunc <T、T、T>  
 // 最後の戻り型T前述のタイプのすべてのパラメータの値を入力!!! 
のFunc < 文字列整数 > =関数func2(I)=> INT .Parse(I);
 // タイプTリターンタイプの最後のパラメータが複数ある場合は、フロントパラメータの型があり、すべての!!! 
のFunc < int型文字列int型 > = FUNC3(I、STR)=> int型 .Parse(私は+ STR); 

// 呼び出し
ます。Console.WriteLine(関数func1()); 
Console.WriteLineを(関数func2(" 123 "));
Console.WriteLineを(FUNC3(1" 23 "));

業績

 

おすすめ

転載: www.cnblogs.com/ckka/p/11388029.html