C#でよく見られるシステム内蔵委託用法の詳細

5042 ワード

一般的に、C#は共通言語ランタイム(CLR)環境で、Actionクラスの依頼、Funcクラスの依頼、Predicate依頼、Comparison依頼など、一般的な依頼を内蔵しています.以上の依頼のネーミングスペースはSystemであり,所属プログラムセットはmscorlib.dllであるが,今日はこれらの依頼の使い方について述べる.
独自に定義したように、いくつかの機能を実現するには、新しい依頼を明示的に定義し、名前付きメソッドを委任に割り当てることなく、システム内蔵の依頼を直接利用してインスタンス化することができます.例えば:

public static void Test()
{
  Console.WriteLine("Just For Test");
}
static void Main(string[] args)
{
  Action a = new Action(Test); //       Action  ,          
  a();
}

このシステムに組み込まれた依頼が何をしているのか,どのパラメータを渡しているのか,どの値を返すのかを知れば,上記の例に倣って自分で呼び出すことができ,これ以上述べることはない.以下は私がこの4種類の依頼をまとめ、匿名の方法とLambda式を組み合わせた例を添付します.2つの方法が実現した結果と同じように、皆さんは1、3を挙げて、柔軟に運用することができます.
一、アクション類の依頼
1.Actionは、パラメータを持たず、値を返さないメソッドのカプセル化を依頼する
2.Actionは、パラメータが1つしかなく、値を返さないメソッドのカプセル化を依頼する
3.Actionは、値を返さずに2つのパラメータを持つメソッドをカプセル化するように依頼する
…… ……
17.Actionは、16個のパラメータを有し、値を返さない方法をカプセル化することを委託する
次に、Action依頼を例に、パラメータの個数に違いがあるだけのActionクラスの依頼をどのように使用するかを示します.

static void Main(string[] args)
{
  #region Action    
  //  :       list   
  List list = new List() { 1, 2, 3, 4, 5 };
  //         Action     
  Action concat1 = delegate(int i) { Console.WriteLine(i); };
  list.ForEach(concat1);
  //  lambda        Action     
  Action concat2 = (i => Console.WriteLine(i));
  list.ForEach(concat2);
  Console.ReadKey();
  #endregion 
}
まとめ:
Actionクラスの依頼は最低0個のパラメータを入力でき、最大16個のパラメータを入力でき、パラメータタイプはすべてインバータであり、値を返さない.
二、Func類の委託
1.Func(TResult)は、パラメータを持たないがTResultパラメータで指定されたタイプ値を返すパッケージ化を依頼する方法
2.Func(T,TResult)は、パラメータを1つ持ってTResultパラメータで指定されたタイプ値を返す方法をパッケージ化することを依頼する
3.Func(T 1,T 2,TResult)は、2つのパラメータを有し、TResultパラメータで指定されたタイプ値を返す方法をパッケージ化するように依頼する
…… ……
17.Funcは、16個のパラメータを持つメソッドをカプセル化し、TResultパラメータで指定されたタイプの値を返します.
次に,Func依頼を例に,パラメータ個数に違いがあるだけのFuncクラスの依頼をどのように使用するかを示す.

static void Main(string[] args)
{
  #region Func    
  //  :      list   3           ,        
  List list = new List() { 1, 2, 3, 4, 5 };
  //         Func     
  Func concat1 = delegate(int i) { return i > 3; };
  var newlist1 = list.Where(concat1).ToList();
  //  Lambda        Func     
  Func concat2 = i => i > 3;
  var newlist2 = list.Where(concat2).ToList();
  newlist1.ForEach(i => Console.WriteLine(i.ToString()));
  newlist2.ForEach(i => Console.WriteLine(i.ToString()));
  Console.ReadKey();
  #endregion
}

まとめ:
Funcクラスの依頼は最低でも入力汎用パラメータ(in,インバータ)1個,最大で入力汎用パラメータ(in,インバータ)16個,入力出力汎用パラメータ(out,コヒーレント)は1個のみ,この依頼パッケージのメソッドの戻り値タイプである.
三、Predicate委託
条件のセットを定義し、指定したオブジェクトがこれらの条件に合致するかどうかを決定する方法を示します.
以下に、Predicate依頼の例を示します.

static void Main(string[] args)
{
  #region Predicate    
  //  :      list   3           ,        
  List list = new List() { 1, 2, 3, 4, 5 };
  //         Predicate     
  Predicate concat1 = delegate(int i) { return i > 3; };
  var newlist1 = list.FindAll(concat1);
  //  lambda        Predicate     
  Predicate concat2 = (c => c > 3);
  var newlist2 = list.FindAll(concat2);
  newlist1.ForEach(i => Console.WriteLine(i));
  newlist2.ForEach(i => Console.WriteLine(i));
       Console.ReadKey();
  #endregion
}

まとめ:
Predicateは、比較するオブジェクトのタイプを示すタイプパラメータを入力するメソッドをパッケージ化し、このタイプパラメータは逆変換であり、同時にパラメータを受信する(このパラメータは、この依頼で表されるメソッドで定義された条件に従って比較するオブジェクトであり、パラメータのタイプは入力されたタイプパラメータのタイプである).このメソッドは常にboolタイプの値を返します.オブジェクトがこの依頼表現のメソッドで定義された条件に合致する場合、trueとなります.そうでなければfalseです.
四、Comparison依頼
同じタイプの2つのオブジェクトを比較する方法を示します.
次に、Comparisonからの依頼の例を示します.

static void Main(string[] args)
{
  #region Comparison    
  //  :     list              
  List list = new List() { 1, 2, 3, 4, 5 };
  //         Comparison     
  Comparison concat1 = delegate(int i, int j) { return j - i; };
  //  lambda        Comparison     
  Comparison concat2 = (i, j) => j - i;
  list.Sort(concat1);
  list.ForEach(c => Console.WriteLine(c.ToString()));
  list.Sort(concat2);
  list.ForEach(c => Console.WriteLine(c.ToString()));
       Console.ReadKey();
  #endregion
}

 まとめ:
Comparisonは、比較するオブジェクトのタイプを示すタイプパラメータを入力するメソッドをパッケージ化します.このタイプパラメータは逆変換であり、同時に2つの同じタイプのパラメータ(この2つのパラメータは比較する2つのオブジェクトであり、パラメータのタイプは入力するタイプパラメータのタイプ)を受信し、intタイプの値、すなわちシンボル付き整数を常に返します.xとyの相対値を示し、以下の表に示す.

意味
0未満
x yより小さい 
0
x yに等しい 
0より大きい
x yより大きい 
ここで述べたように、皆さんのC〓プログラムの設計に役に立ちます.