1. 程式人生 > >C# -委託、泛型委託、匿名方法、Lambda表示式

C# -委託、泛型委託、匿名方法、Lambda表示式

前言

   這幾天一直在回顧之前的知識,不是常用的都已經忘記了,俗話說得好,書到用時方恨少。之前對於委託一直都是雲裡霧裡的,在此總結一下,以便日後檢視!

委託

  • 委託(delegate):委託是一種資料型別,像類一樣,可以宣告委託型別的變數,它可以將方法當做另一個方法來進行傳遞。
  • 委託(delegate)至少0個引數,至多32個引數,可以無返回值,也可以指定返回值型別。

例項

namespace 委託
{
    class Program
    {
        static void Main(string[] args)
        {
            MyDelegate md = new MyDelegate(M1);

            //呼叫md委託的時候就相當於呼叫的M1方法
            md();
            Console.ReadLine();
        }
        static void M1()
        {
            Console.WriteLine("我是一個沒有返回值沒有引數的方法");
        }
    }
    //定義了一個名字叫MyDelegate的型別,並且這個型別是個委託,而且只能儲存沒有返回值,沒有引數的方法
    public delegate void MyDelegate();
}

在這裡插入圖片描述
很好理解的一個例項,當然委託的用處不僅於此!

匿名方法

匿名方法:不能直接在類中定義,而是在給委託變數賦值的時候,需要賦值一個方法,此時可以“現做現賣”,定義一個匿名方法傳給委託。這個匿名方法我們要熟悉他的語法,後面我會介紹lambda表示式。

例項

namespace 匿名方法
{
    class Program
    {
        static void Main(string[] args)
        {
            Mydelegate md = delegate ()
              {
                  Console.WriteLine("我是一個現做現賣的匿名方法");
              };
            md();
            Console.Read();
        }
    }
    public delegate void Mydelegate();
}

在這裡插入圖片描述

lambda表示式

lambda表示式就是對匿名方法的一個升級,變得更方便了,語法如下。

namespace 匿名函式
{
    class Program
    {
        static void Main(string[] args)
        {
            //無引數用小括號代表
            MyDelegate md = () => { Console.WriteLine("lambda表示式!"); };

            //有引數直接傳引數,不用傳遞資料型別,委託已經限定資料型別
            MyDelegate1 md1 = m => { Console.WriteLine(m); };
            md();
            md1("大家好");
            Console.ReadLine();
        } 
    }
    //有引數的委託
    delegate void MyDelegate1(string msg);
    
    //無引數的委託
    delegate void MyDelegate();
}

在這裡插入圖片描述

泛型委託

說到泛型委託,首先要明白為什麼要有泛型委託,如果我們有三個方法,這三個方法的引數的資料型別都不同。這時我們就要定義三個委託,程式猿是聰明的,泛型委託解決了這一問題。

例項

namespace 泛型委託
{
    class Program
    {
        static void Main(string[] args)
        {            
            //泛型委託
            MyGenericDelegate<string> md = M1;
            md("我是引數為string型別的方法");
            MyGenericDelegate< int > md1 = M1;
            md1(250);
            Console.Read();
        }
        static void M1(int j)
        {
            Console.WriteLine(j);
        }
        static void M1(string msg)
        {
            Console.WriteLine(msg);
        }
    }
    //泛型委託
    public delegate void MyGenericDelegate<T>(T args);
}

微軟也是很愛程式猿的,編譯器自帶了一個泛型的委託Action,它有16個過載,用起來非常的方便**

namespace 泛型委託
{
    class Program
    {
        static void Main(string[] args)
        {
            
            Action action1 = new Action(M1);
            action1();

            Action<string> al = M1;
            al("我是引數為string型別的方法");

            Action<int> al1 = M1;
            al1(250);
      
        }
        static void M1()
        {
            Console.WriteLine("我是一個無引數的方法");
        }
        static void M1(int j)
        {
            Console.WriteLine(j);
        }
        static void M1(string msg)
        {
            Console.WriteLine(msg);
        }
    }
}

在這裡插入圖片描述
說到這裡,可能會有大佬想到這些都是無返回值的,如果我的方法是有返回值的怎麼辦,這時候不要慌,我都說了微軟是愛程式猿的,Func解決了這個問題,和Action的使用方式一樣它只是帶返回值的。

namespace 泛型委託
{
    class Program
    {
        static void Main(string[] args)
        {
             //第四個int表示返回值的資料型別
            Func<int, int, int, int> fun =(M1);
            int result= fun(1, 2, 4);
            Console.WriteLine(result);
            Console.Read();
        }
        static int M1(int n1, int n2, int n3)
        {
            return n1 + n2 + n3;
        }
    }
}

在這裡插入圖片描述

總結

委託真的好強大,以後也會經常遇到,希望這篇部落格對您有幫助。做了固然重要,知道為什麼要這樣做更重要。如有大佬發現問題,我們一起交流學習!