C#==>匿名方法

來源:互聯網
上載者:User

標籤:style   blog   http   color   使用   ar   art   div   問題   

1,匿名方法

C#為委託提供一種機制,可以為委託定義匿名方法,匿名方法沒有名稱,編譯器會定指定一個名稱

匿名方法中不能使用跳躍陳述式跳轉到該匿名方法的外部,也不能跳轉到該方法的內部。

也不能在匿名方法外部使用的ref和out參數

 

    public class A { }    //B繼承自A    public class B : A { }    class Program    {        //委託的傳回型別是A        public delegate A MyDelegate();                static void Main(string[] args)        {            //向委託添加方法Method            MyDelegate my = Method;            //方法Method的傳回型別可以派生於委託定義的傳回型別,這就是協變            my();            //※,如果將委託的傳回型別,和Method方法的傳回型別互換,就會產生編譯錯誤        }        //方法返回一個子類B的類型,B繼承自A        static B Method()        {             return new B();        }    }

 

 

2,匿名方法的【λ(拉姆達)運算式】方式定義

 

C#3.0之後匿名方法可以使用λ運算式來進行定義

無論是拉姆達(lambda)運算式(事實上應該叫匿名函數)或是匿名類,都能歸屬到一種叫閉包的東西上面。

 

λ運算子 =>

左邊是參數,使用括弧表達 (string param),可以是 (param)這樣不定義類型,編譯器會推斷出來,只有一個參數的時候可以不使用括弧

右邊是實現代碼,使用花括弧,如果代碼只有一行,則不使用花括弧和return關鍵字也可以,編譯器會為我們添加

這是λ運算式的簡單實現

string str1 = " 匿名方法外部 ";
string str2 = " 匿名方法內部 ";

MyDelagate my = param => param + str1 + str2;

Console.WriteLine(my(" 參數 "));

 

3,委託調用過程的協變和抗變

關於委託的傳回型別和委託方法的參數傳遞,如果我們不能正確使用的時候,經常會發生“協變和抗變”的錯誤。

需要額外注意

 

傳回型別:傳回型別需要注意的是協變

               方法的傳回型別可以派生於委託定義的類型。

 

參數類型:參數類型需要注意的是抗變

               向委託傳遞的參數類型可以派生於委託方法的參數類型

 

傳回型別的協變

 

    public class A { }    //B繼承自A    public class B : A { }    class Program    {        //委託的傳回型別是A        public delegate A MyDelegate();                static void Main(string[] args)        {            //向委託添加方法Method            MyDelegate my = Method;            //方法Method的傳回型別可以派生於委託定義的傳回型別,這就是協變            my();            //※,如果將委託的傳回型別,和Method方法的傳回型別互換,就會產生編譯錯誤        }        //方法返回一個子類B的類型,B繼承自A        static B Method()        {             return new B();        }    }

 

 

 參數類型的抗變

 

    public class A { }    //B繼承自A    public class B : A { }    class Program    {        //委託的傳回型別是A        public delegate void MyDelegate(B b);                static void Main(string[] args)        {            //向委託添加方法Method            MyDelegate my = Method;            //向委託傳遞的參數的類型可以派生於委託方法的參數類型,這就是抗變            my(new B());            //※,如果將委託的參數的類型,和Method方法的參數的類型互換,就會產生編譯錯誤                    }        //方法返回一個子類B的類型,B繼承自A        static void Method(A a) { }            }

 

 

 //實際上繼承自A的類型B的執行個體可以轉化為A,而子類向父類轉化的過程,在預設情況下會有編譯錯誤
//如下代碼
A aa = new A();
B bb = new B();
//這句沒問題
aa = bb;
//子類向父類轉化的過程中存在問題
bb = aa;

 

以上協變和抗變都是由這個原因產生的

 

by:http://blog.csdn.net/gishero/article/details/5161826

C#==>匿名方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.