C#依頼(Func、Action)

8103 ワード

原文住所:https://cloud.tencent.com/developer/article/1335104
1、Func用法(カプセル化方法、入力パラメータ、戻り値あり)
Func (T1, T2, ...)  
(0/1/2/3...16)個のパラメータがあり、TResultパラメータによって指定された値のタイプを返すメソッドをカプセル化します.
 
public static void Main()
        {
            //    : Func            
            Func<int, int, string> method = Calculate;

            //    :    Lambda     ,    
            Func<int, int, string> method_1 = (x, y) =>
            {
                int val = x + y;
                return string.Format("the calculate {0} plus {1} result is: {2}", x, y, val);
            };

            Console.WriteLine(method(3, 5));
            Console.WriteLine(method_1(10, 18));
            Console.ReadLine();
        }


        public static string Calculate(int x, int y)
        {
            int val = x + y;
            return string.Format("the calculate {0} plus {1} result is: {2}", x, y, val);
        }

 
2、Action用法(一つの方法をカプセル化し、パラメータを入力し、戻り値がない)
 Action(t1, t2, t3 ...)
メソッドをカプセル化します(0/1/2...)個のパラメータで、値は返されません.
 public static void Main()
        {
            Method_First("Hi, Here!");
            Method_First("Hi, There!");

            Console.ReadLine();
        }

        private static void Method_First(string y)
        {
            Action<string> method;
            method = x => { Console.WriteLine("the input message is: {0}", x); };
            method(y);
        }

        private static void Method_Sec(string y)
        {
            Action<string> method = x => { Console.WriteLine("the input message is : {0}", x); };
            method(y);
        }

 
3.委託使用
2つの異なる状況の依頼について話しましたが、依頼はいつ使いますか?
公式文書によると、以下の場合、委任を使用してください.
  • イベント設計モードが使用される場合.
  • パッケージング静的方法が望ましい場合.
  • 呼び出し元がメソッドを実装するオブジェクトの他の属性、メソッド、またはインタフェースにアクセスする必要がない場合.
  • は便利な組み合わせが必要です.
  • クラスがこの方法の複数の実装を必要とする場合.

  • 4.Taskでの使用依頼
    Taskは非同期動作を表す.
    public static void Main()
            {
                //     1
                Task t = Task.Run(() => 
                {
                    Thread.Sleep(1000);
                    Console.WriteLine("First task finished time is:{0}", DateTime.Now.ToString());
                });
    
    
                //   2
                Task t_2 = Task.Factory.StartNew(() => {
                    Thread.Sleep(2000);
                    Console.WriteLine("second task finished time is:{0}", DateTime.Now.ToString());
                });
    
    
                //    3
                Action action = () =>
                {
                    Thread.Sleep(3000);
                    Console.WriteLine("third task finished time is:{0}", DateTime.Now.ToString());
                };
                Task.Factory.StartNew(action).ContinueWith(thirdTask =>
                {
                    if (thirdTask.IsCompleted)
                    {
                        Console.WriteLine("the third task has finished");
                    }
                    else if (thirdTask.IsFaulted)
                    {
                        Console.WriteLine(thirdTask.Exception);
                    }
                });
    
                Console.WriteLine("main thread has end:{0}",DateTime.Now.ToString() );
    
                Console.ReadKey();
            }

    実行結果は次のとおりです.
    main thread has end:2018-03-04 22:03:39
    First task finished time is:2018-03-04 22:03:40
    second task finished time is:2018-03-04 22:03:41
    third task finished time is:2018-03-04 22:03:42
    the third task has finished