首頁 > 軟體

淺談C#中Action和Func回撥的常用方式

2022-03-22 13:01:26

一、簡介

Action和Func泛型委託實際上就是一個.NET Framework預定義的委託,3.5引入的特性。基本涵蓋了所有常用的委託,所以一般不用使用者重新宣告。Action系列泛型委託,是沒有返回引數的委託,最多可以有16引數,也可以沒有引數。

Func系列的委託是有返回值的委託,最多可以有16個引數;元組是C# 4.0引入的一個新特性,編寫的時候需要基於.NET Framework 4.0或者更高版本。元組使用泛型來簡化一個類的定義.提供用於創造元組物件的靜態方法。最多可以提供建立新的 8 元組,即八元組。

二、Action

委託其實就是把方法當作引數來呼叫,Action就是其中之一,Action 作為引數不能有返回值,引數可以是任意型別,也可以不傳遞引數。

例1

呼叫某個類中的Action

using System;
 
namespace Test1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Test1 test1 = new Test1();
            test1.myAction();
 
            Console.ReadKey();
        }
    }
 
    public class Test1
    {
        public Action myAction = null;
 
        private void sayHi()
        {
            Console.WriteLine("fuck you!");
        }
 
        public Test1()
        {
            myAction = sayHi;
        }
    }
}

執行:

這種方式用的比較少,Action常用的方式通常是用來作為和回撥 

例2

執行一系列的操作後,再執行回撥,也是比較推薦的使用方式。

using System;
 
namespace Test1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Test1 test1 = new Test1();
            test1.Calculation(1, 2, ReceiveResult);
 
            Console.ReadKey();
        }
 
        private static void ReceiveResult(int res)
        {
            Console.WriteLine("結算的結果是:" + res);
        }
    }
 
    public class Test1
    {
        public void Calculation(int x, int y, Action<int> call)
        {
            if (call != null)
            {
                call(x + y);
            }
        }
    }
}

執行:

將方法換成 Lambda 表示式,效果一樣的,關於Lambda的使用方法,可以參考:點選跳轉

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Test1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Test1 test1 = new Test1();
            test1.Calculation(1, 2, (int res) =>
            {
                Console.WriteLine("結算的結果是:" + res);
            });
 
            Console.ReadKey();
        }
    }
 
    public class Test1
    {
        public void Calculation(int x, int y, Action<int> call)
        {
            if (call != null)
            {
                call(x + y);
            }
        }
    }
}

三、Func

上面使用Action的案例中,執行回撥後,都沒有返回值,這是因為Action並不能接收返回值,如果想執行回撥,又有返回值怎麼辦呢,Func就是用來解決這個問題的。

Func 必須有一個返回值,否則會報錯,如下圖:

返回值通常是在引數的最後一個,參考例1,Func<int, float, string> MyFunc = null 這個委託中,string 就是返回值,傳遞引數的時候,也只能傳遞兩個引數,如果再多寫一個引數就會報錯,如下圖:

例1

基本的用法,func賦值,執行委託,並接收返回值

using System;
 
namespace Test1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Test1 test1 = new Test1();
            string userName = test1.MyFunc(15, 180.2f);
            Console.WriteLine(userName);
 
            Console.ReadKey();
        }
    }
 
    public class Test1
    {
        public Func<int, float, string> MyFunc = null;
 
        private string GetUserName(int age, float height)
        {
            if (age == 15 && height == 180.2f)
            {
                return "張三";
            }
            return null;
        }
 
        public Test1()
        {
            MyFunc = GetUserName;
        }
    }
}

執行:

例2

 把func作為方法的引數傳遞,並執行回撥

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Test1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Test1 test1 = new Test1();
            Func<string> func = () => 
            {
                string name = "張三";
                string feel = "精力非常旺盛";
                string msg = name + feel;
                return msg;
            };
            test1.Calculation(10, 12, func);
            Console.ReadKey();
        }
    }
 
    public class Test1
    {
        public void Calculation(int x,int y, Func<string> sayFunc)
        {
            if(sayFunc != null)
            {
                int age = x + y;
                string msg = string.Format("年齡是:{0},對年齡的感受:{1}", age, sayFunc());
                Console.WriteLine(msg);
            }
        }
    }
}

執行:

上面程式碼只是作為一個參考,讀者可以根據自己的需求做一個改進。

結束

到此這篇關於淺談C#中Action和Func回撥的常用方式的文章就介紹到這了,更多相關C# Action和Func回撥內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com