六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

對C# 2.0中匿名方法的懷疑區分

[摘要]一、 簡介 所有的方法都使用一個來自于相同集合的元素的子集。在C# 2.0中,可選元素集將會繼續增長。從歷史上看-除了C++內聯方法之外-方法都要求有一個名字、一個返回類型和一個方法體。而且可選擇地,方法可以使用存取修飾符和一個參數列表。在C# 2.0中,方法名已經從必需的變成了可選的。 C#...
一、 簡介 
所有的方法都使用一個來自于相同集合的元素的子集。在C# 2.0中,可選元素集將會繼續增長。從歷史上看-除了C++內聯方法之外-方法都要求有一個名字、一個返回類型和一個方法體。而且可選擇地,方法可以使用存取修飾符和一個參數列表。在C# 2.0中,方法名已經從必需的變成了可選的。 
C# 2.0(一般就代表.NET)引入了匿名方法。一個匿名方法可以被用在任何使用代理且該代理被定義為內聯的情況下,它不需要方法名,而具有可選的參數和一個方法體。 
為了使用匿名方法,你需要了解什么是代理。因此,在我們詳細討論何時使用匿名方法以及匿名方法的局限性之前,先讓我們簡要地回顧一下代理。 
二、 代理回顧 
匿名方法對于聲明和使用代理來說是一種壓縮方式(如果你對什么是代理還有疑問,請繼續閱讀;否則,可以跳過下面的這一部分)。代理,作為一種指向函數簽名的指針,在.NET語言之前的語言中就已存在。切記,在計算機中一切其實都是位和字節。通過引入函數指針技術,有可能動態地把一些未來的目前尚未知的函數賦給指針,并由此誕生了事件。 
函數指針的基本使用方法是,可以把一個函數的地址賦給一個單一的指針。為了通過一個指針來調用該函數,程序員要對之進行檢查以決定是否這個指針為null,然后間接地通過這個指針調用這個函數。總之,要使用指針,必須進行null檢查,而現在"一個指針對應一個函數"作為一種限制也該到結束的時候了。 
回顧一下來分析,代理會成為原始函數指針的下一個進化替代者。一個代理即是一個類,它對該指針進行了封裝;隱含地,.NET中的代理是multicast代理。作為一個multicast代理僅僅意味著不再存在"一個函數對應一個指針"的限制,因為multicast代理類包含一個指針列表。包含一個內部列表意味著多于一個函數的地址可以被賦值給一個單一的代理。當該代理-你可以認為是"事件"-被激發或調用時,所有的內部列表函數被調用。 
注意 在C#中,我們調用代理的方式就象從前我們調用方法以及調用所有的賦值函數一樣;但是我們仍然能夠進行null檢查。在Visual Basic.NET中,null檢查隱含在激活事件行為中。 
在C#中,函數地址通過使用一個重載的+=操作符插入到一個列表中并且經由一個重載的-=操作符而被刪除。C#還支持手工地定義添加和刪除塊;添加和刪除對于代理恰似get和set對于屬性。 
在C# 1.0和C# 1.1中,典型情況下,我們把代理實例賦給事件屬性。例如,在WinForms中,一個Button控件暴露一個Click事件。Click的代理類型是EventHandler。EventHandler是一個以對象和EventArgs為參數的方法。因此,我們可以用匹配代理EventHandler的簽名的任何方法來初始化一個EventHandler對象并且把代理賦給Click。下面是該代碼看上去的樣子: 
private void Form1_Load(object sender, EventArgs e) 
{ button1.Click += new EventHandler(OnClick);} 
private void OnClick(object sender, EventArgs e) 
{ Debug.WriteLine("button1 clicked");} 
因為WinForms的表單設計器和WebForms的頁面設計器自動地添加代理綁定;所以,我們有可能不需要手工式地綁定代理而建立大量的代碼。 
三、 匿名方法是內聯代理 
通常,當我們使用代理時,我們總是有一個方法。該方法的簽名匹配代理的簽名規定并且能被用來初始化一個代理實例。匿名方法用于把方法和代理的初始化壓縮到一個單一的位置。 
通過使用前一節的例子,我們已看到代理new EventHandler的實例化是怎樣區別于用來初始化該代理的方法OnClick的。這部分代碼能被壓縮成一個匿名方法: 
private void Form1_Load(object sender, EventArgs e){ 
button1.Click += delegate 

Debug.WriteLine("button1 clicked"); 
}; 

為了創建該匿名方法,請注意我們刪除了OnClick的方法頭并且用OnClick的方法體的單詞delegate代替了EventHandler代理的構造器。其所導致的結果行為是相同的。如果我們想使用事件參數,我們通常與代理相關聯,我們可以在單詞delegate之后添加一可選的參數列表: 
private void Form1_Load(object sender, EventArgs e){ 
button1.Click += delegate(object s, EventArgs ev) 
{ Debug.WriteLine("object is " + s.ToString()); }; 

如果你定義代理參數,它們必須匹配代理類型所定義的參數。例如,Click的類型是EventHandler,因此如果參數存在,它們必須匹配EventHandler的參數對象和EventArgs。 
匿名方法可以被使用在任何需要使用代理的地方。匿名方法可以使用ref和out參數,但是不能使用全局范圍的reference ref或out參數。匿名方法不能使用unsafe編碼,并且匿名方法不能以使得分支行為跳出匿名方法的代碼塊的方式來使用goto,break或continue等語句。 
四、 市場調查結果 
匿名方法是好東西嗎?市場調查證明匿名方法確實不錯,因為它們能夠減少由于實例化代理和減少分離方法所導致的代碼開銷。而且市場調查還證明匿名方法增強了可用性和可維護性。我認為良好命名的方法也可以實現這一點。請看下面的代碼容易維護嗎? 
        private void Form1_Load(object sender, EventArgs e) 
       { 
        BindClick(delegate { Debug.WriteLine("button1 click"); }); 
        } 
        private void BindClick(EventHandler handler) 
        { 
        button1.Click += handler; 
        } 
在這個例子中,我們把一個代理傳遞給一個方法-通過把該代理作為一個匿名方法傳遞。僅是保持圓括號、分號和方括號的順序和個數就已令人十分頭疼。 
如果引用經典示例來說明,那就是匿名方法僅僅是因剔除了線程(它們使用代理)而減少了相應的創建代理和方法的開銷。這倒是真的,但是線程并不經常使用并且想正確使用也非常困難。我在想,要想使代碼更為秘密些而不是更為公開些該是多么謹慎的一件事情。 
就語言方面來講,我喜歡方法;但是作為一個實際開發中的事物,匿名方法也許僅是微軟的某個發明者有點太聰明的一種證明。 
五、 總結 
匿名方法是可以存在沒有名字的方法的證明-它們可以被定義并使用在任何能夠使用代理的地方。代理是事件處理器的包裝器。匿名方法到底有多大的實用性和普遍使用價值還有待于進一步的實踐證明。我懷疑,匿名方法將不會比運算符重載有更大的用途,并且其使用也會少之又少;但是匿名方法現在已是.NET的一部分,所以在閱讀代碼時能夠識別出它們來還是很有必要的。



主站蜘蛛池模板: 日日夜夜天天久久 | 日韩毛片免费看 | 外国成人网在线观看免费视频 | 手机看片日韩在线 | 欧美特黄一级片 | 中文字幕日韩精品在线 | 天天综合天天综合色在线 | 伊人久久综合影院首页 | 五月香福利 | 天天干夜夜爽 | 青青草视频黄色 | 午夜影院在线观看 | 伊人影院视频 | 日韩性大片免费 | 最近中文字幕无吗高清免费视频 | 亚拍一区 | 欧美中文娱乐网 | 日韩精品欧美国产精品亚 | 日韩视频第二页 | 日本福利网站 | 五月婷婷六月合 | 亚色在线观看 | 欧洲大肥批 | 青青草国产精品视频 | 日本三级理论片 | 日本黄色一级大片 | 片免费观看网站视频 | 日本免费一二三区 | 伊人55影院 | 中文字幕免费在线观看 | 深夜 免费 视频 | 一区精品麻豆入口 | 欧美亚洲日本国产 | 一级黄色大片免费 | 亚洲永久精品网站 | 日本在线看小视频网址 | 青娱乐在线观看 | 欧美一级二级三级视频 | 中文字幕 国产精品 | 亚洲一区二区三区在线 | 日本叼嗨 |