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

C#中的匿名方法,

編輯:C#入門知識

C#中的匿名方法,


C#中的匿名方法是在C#2.0引入的,它終結了C#2.0之前版本聲明委托的唯一方法是使用命名方法的時代。雖然在 C# 3.0 及更高版本中,Lambda 表達式取代了匿名方法,作為編寫內聯代碼的首選方式。但是,匿名方法的信息同樣也適用於 Lambda 表達式,可以說 Lambda 表達式就是匿名方法演變過來的,這點後續博文會講解推演的過程。  我們可以使用匿名方法來忽略參數列表。 這意味著匿名方法可轉換為具有各種簽名的委托,而這對於 Lambda 表達式來說是不可能的。 學好匿名方法,才能更加深刻地理解好 Lambda 表達式。

在說匿名方法的使用之前,先來說說匿名方法的其他叫法。匿名方法也有人叫匿名委托、匿名函數,雖然現在普遍通用,但是還是有點區別的。msdn官網上說:要將代碼塊傳遞為委托參數,創建匿名方法則是唯一的方法。這裡的匿名方法就是官方的說法,而因為匿名方法就是為了將代碼塊傳遞為委托參數,因此也有人叫匿名委托,包括筆者也喜歡這種稱呼,我覺得這樣叫通俗易懂。至於匿名函數,因為C#中“方法”(Method)的概念有些語言叫“函數”(Function),因此匿名方法也被人叫做匿名函數。然而在msdn文檔介紹中匿名函數包括了Lambda 表達式和匿名方法,可以說匿名函數是更高的一級,所以說最官方的叫法還是匿名方法,當然其他的叫法流傳也甚廣,聽得懂就行了,沒必要糾結。

接下來說說匿名方法的寫法規則,先上例子:

delegate(int i) { return i > 0; }

它遵循這樣的格式書寫:delegate(形參表){方法體代碼},可以類比js中匿名函數的寫法來記憶。
那麼匿名方法運用在哪裡呢?怎麼使用呢?當你需要一個臨時方法,該方法使用次數極少或者你需要的這個方法的代碼很簡短,那麼你就可以使用匿名方法。給個簡單的例子,如果需要在一個整型集合中篩選出符合條件的新集合,如下

List<int> list = new List<int>() { 1, 2, 3, 4, 5, 6 };
//假設需要從list集合中獲取大於3的所有元素以新集合返回
var newlist = newlist.FindAll(GetNewList);

GetNewList()為另外定義的和委托Predicate<T>具有同簽名的方法(Predicate<T>是系統內置委托,後續博文會講)
GetNewList()定義如下:

bool GetNewList(int i)
    {
         return i > 3;
    }

以上是沒有使用匿名方法時的寫法,如果使用了匿名方法,你就會發現一切變得如此簡便,

List<int> list = new List<int>() { 1, 2, 3, 4, 5, 6 };
var newlist = list.FindAll(delegate(int i) { return i > 3; });

通過對比,可以發現使用匿名方法能夠提供與先前命名方法相同的功能,但是它已經不再需要一個在關聯到委托之前就明確創建的方法了,因此也減少了實例化委托所需的編碼系統開銷,這就是它的最大好處。

 


C語言中->是什?

->是一個整體,它是用於指向結構體、C++中的class等含有子數據的指針用來取子數據。換種說法,如果我們在C語言中定義了一個結構體,然後申明一個指針指向這個結構體,那麼我們要用指針取出結構體中的數據,就要用到“->”.
舉個例子:
struct Data
{
int a,b,c;
}; /*定義結構體*/
struct Data * p;/*定義結構體指針*/
struct Data A = {1,2,3};/*聲明變量A*/
int x;/*聲明一個變量x*/
p = &A ; /*讓p指向A*/
x = p->a;/*這句話的意思就是取出p所指向的結構體中包含的數據項a賦值給x*/
/*由於此時p指向A,因而 p->a == A.a,也就是1*/

對於一開始的問題 p = p->next;這應該出現在C語言的鏈表,這裡的next應該是一個與p同類型的結構體指針,其定義格式應該是:
struct Data
{
int a;
struct Data * next;
};/*定義結構體*/
…………
main()
{
struct Data * p;/*聲明指針變量p*/
……
p = p->next;/*將next中的值賦給p*/
}
鏈表指針是C語言的一個難點,但也是重點,學懂了非常有用。要仔細講就必須先講變量、指針。
什麼是變量?所謂變量,不要淺顯的認為會變得量就是變量。套用我們院長的問話:“教室變不變?”變,因為每天有不同的人在裡面上課,但又不變,因為教室始終在那,沒有變大或變小。這就是變量:有一個不變的地址和一塊可變的存儲空間。正常情況下,我們只看到變量這個房間裡面的東西,也就是其內容,但不會關注變量的地址,但是C語言的指針,就是這個房間的地址。我們聲明變量就相當於蓋了間房子存放東西,我們可以直接觀看房子裡的東西,而聲明指針,就是相當於獲得了一個定位器,當用指針指向某個變量時,就是用指針給變量定位,以後我們就可以用指針找到他所“跟蹤”的變量並可以獲得裡面的內容。
那結構體呢?結構體就相當於是有好幾個房子組成的別墅,幾個房子綁定在一起使用。假設現在有很多這種別墅分布在一個大迷宮裡,每間別墅裡都有一間房子。裡面放了另一個別墅的位置信息,現在你手拿定位器找到了第一棟別墅,從裡面得到了你想要的東西(鏈表的數據部分),然後把下一棟別墅的位置計入你的定位器(p = p->next),再走向下一棟別墅……如此走下去,知道走到某地下一棟別墅信息沒有了(p->next == NULL),你的旅行結束。這就是鏈表一次遍歷的過程。現在你能明白 p=p->next的含義了吧!
寫了這麼多。希望你能明白。
如果想學好c和C++,鏈表和指針必須熟練掌握!
 

C語言中->是什?

->是一個整體,它是用於指向結構體、C++中的class等含有子數據的指針用來取子數據。換種說法,如果我們在C語言中定義了一個結構體,然後申明一個指針指向這個結構體,那麼我們要用指針取出結構體中的數據,就要用到“->”.
舉個例子:
struct Data
{
int a,b,c;
}; /*定義結構體*/
struct Data * p;/*定義結構體指針*/
struct Data A = {1,2,3};/*聲明變量A*/
int x;/*聲明一個變量x*/
p = &A ; /*讓p指向A*/
x = p->a;/*這句話的意思就是取出p所指向的結構體中包含的數據項a賦值給x*/
/*由於此時p指向A,因而 p->a == A.a,也就是1*/

對於一開始的問題 p = p->next;這應該出現在C語言的鏈表,這裡的next應該是一個與p同類型的結構體指針,其定義格式應該是:
struct Data
{
int a;
struct Data * next;
};/*定義結構體*/
…………
main()
{
struct Data * p;/*聲明指針變量p*/
……
p = p->next;/*將next中的值賦給p*/
}
鏈表指針是C語言的一個難點,但也是重點,學懂了非常有用。要仔細講就必須先講變量、指針。
什麼是變量?所謂變量,不要淺顯的認為會變得量就是變量。套用我們院長的問話:“教室變不變?”變,因為每天有不同的人在裡面上課,但又不變,因為教室始終在那,沒有變大或變小。這就是變量:有一個不變的地址和一塊可變的存儲空間。正常情況下,我們只看到變量這個房間裡面的東西,也就是其內容,但不會關注變量的地址,但是C語言的指針,就是這個房間的地址。我們聲明變量就相當於蓋了間房子存放東西,我們可以直接觀看房子裡的東西,而聲明指針,就是相當於獲得了一個定位器,當用指針指向某個變量時,就是用指針給變量定位,以後我們就可以用指針找到他所“跟蹤”的變量並可以獲得裡面的內容。
那結構體呢?結構體就相當於是有好幾個房子組成的別墅,幾個房子綁定在一起使用。假設現在有很多這種別墅分布在一個大迷宮裡,每間別墅裡都有一間房子。裡面放了另一個別墅的位置信息,現在你手拿定位器找到了第一棟別墅,從裡面得到了你想要的東西(鏈表的數據部分),然後把下一棟別墅的位置計入你的定位器(p = p->next),再走向下一棟別墅……如此走下去,知道走到某地下一棟別墅信息沒有了(p->next == NULL),你的旅行結束。這就是鏈表一次遍歷的過程。現在你能明白 p=p->next的含義了吧!
寫了這麼多。希望你能明白。
如果想學好c和C++,鏈表和指針必須熟練掌握!
 

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