程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 對C# 2.0中匿名方法的懷疑分析(1)

對C# 2.0中匿名方法的懷疑分析(1)

編輯:關於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的頁面設計器自動地添加代理綁定; 所以,我們有可能不需要手工式地綁定代理而建立大量的代碼。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved