C 委託和事件(3)

2022-02-13 19:45:50 字數 2931 閱讀 4197

面試例題4:舉例說明匿名方法。

考點:匿名方法的作用,匿名方法的使用方法。

出現頻率:★★★

解答匿名方法用於簡化事件註冊方法的編寫過程,可以直接將方法體的**和委託物件相關聯而不需要單獨定義這個方法。本例程式仍然實現eventdel.cs的相同功能,只是將事件處理方法更改為匿名方法,並且在name類中將觸發事件的**直接編寫在text屬性的set訪問器中。在目錄下新建乙個程式檔案,並命名為anomethod.cs,編寫**如**7.4所示。

**7.4  c#的匿名方法:anomethod.cs

using system;
class anomethod

", e.tostring());

console.writeline("事件發布者是:", sender.tostring());

console.writeline("你輸入的名字是:", ((name)sender).text);

};console.write("\n請輸入你的名字:");

//接收使用者的輸入值並賦值給input變數

string input = console.readline();

//將input變數賦值給myname物件的text屬性

myname.text = input;} }

class name

set}

//重寫tostring()方法

public override string tostring()

//自定義事件資訊類,繼承於eventargs類

public class nameeventargs : eventargs

//重寫tostring()方法,返回_args欄位

public override string tostring()

}}

本示例程式功能和eventdel.cs完全一樣,用於顯示使用者輸入,事件觸發後呼叫匿名事件處理方法。在命令列下編譯anomethod.cs,執行anomethod程式,程式將提示"請輸入你的名字",輸入"葉青",執行結果如圖7.6所示。

本程式執行結果與eventdel.cs完全一致,只是匿名方法的編寫更為高效。回顧list物件的findall()方法,該方法的引數是乙個泛型委託(委託型別為predicate),編寫方法如以下**所示:

using system;

using system..collections.generic

//定義1個list類的物件mylist ,型別引數t為int

listmylist = new list();

新增部分int型別子項到mylist 物件中;

listmylist2 = mylist2.findall(delegate(匹配方法引數));

foreach (int i in mylist2)

以上**將predicate泛型委託物件的編寫進行了大量簡化,不需要單獨定義匹配方法。

注意:是否採用匿名方法根據情況來定,如某些方法體**比較複雜,或者方法可用於委託物件以外時,不可以採用匿名方法。

解析c#的匿名方法可以使委託及事件的**編寫更加精簡高效。一般情況下,註冊事件處理方法,首先需要定義處理方法,如果該方法僅用於訂閱特定的事件,則可使用匿名方法。假設定義了名為mydel委託型別,事件名稱為onclick,其註冊事件處理方法如以下**所示:

static void main(string args)

//單獨定義事件處理方法

static 返回型別 事件處理方法(object sender, eventargs e)

以上**中的事件處理方法往往只用於委託物件,而匿名方法可以使事件處理方法不需要單獨定義,如以下**所示:

static void main(string args)

;其他**;

}

以上**的事件處理方法沒有名稱,被稱為匿名方法。匿名方法的方法體**直接和委託物件關聯,不需要指定委託物件名稱。

說明:實際編譯時,匿名方法的名稱由編譯器自動分配。

面試例題5:簡述lambda表示式的使用方法。

考點:lambda表示式的作用, lambda表示式的使用方法。

出現頻率:★

解答lambda表示式可以進一步簡化編寫的**,在匿名方法的基礎上,甚至可以隱藏delegate關鍵字。不過lambda表示式不可濫用,應根據程式需要而使用。本例程式仍然實現anomethod.cs相同的功能,只是將匿名方法部分更改為lambda表示式。在目錄下新建乙個程式檔案,並命名為lambda.cs,編寫**如**7.5所示。

**7.5  c#的lambda表示式:anomethod.cs

using system;
class lambda

", e.tostring());

console.writeline("事件發布者是:", sender.tostring());

console.writeline("你輸入的名字是:", ((name)sender).text);

};console.write("\n請輸入你的名字:");

//接收使用者的輸入值並賦值給input變數

string input = console.readline();

//將input變數賦值給myname物件的text屬性

myname.text = input;} }

class name

set}

//重寫tostring()方法

public override string tostring()

//自定義事件資訊類,繼承於eventargs類

public class nameeventargs : eventargs

//重寫tostring()方法,返回_args欄位

public override string tostring()

}}

C 事件和委託

c 程式設計中的事件驅動是說應用程式的執行流程是由外界發生的事件確定的。也就是接受到任務再工作的模式。事件是乙個訊號,它告知應用程式有重要的事情發生。真正的執 況是,各個應用程式把負責不同功能的物件在其執行期間送入windows作業系統,讓這些物件等待windows產生事件。然後加以處理,windo...

C 委託和事件

什麼是委託?委託和事件這兩個概念是完全配合的。委託僅僅是函式指標,那就是說,它能夠引用函式,通過傳遞位址的機制完成。委託是乙個類,當你對它例項化時,要提供乙個引用函式,將其作為它建構函式的引數 先看示例 例中先申明乙個委託,例如 public delegate void somedelegate s...

C 委託和事件

要為類構造乙個事件,必須用 event 來宣告乙個 delegate 型的字段,如 puclic calss test 在建立類的例項後定義這個 load 事件 test m new test m.load new eventhandler m load void m load object sen...