.NET Framework学习笔记(十)
17.委托
.NET框架使用委托delegate來提供回調函數機制。
class?Set{
????private?Object[]?items;
????public?Set(int?numItems)
????{
????????items?=?new?Object[numItems];
????????for?(int?i?=?0;?i?<?numItems;?i++)
????????{
????????????items[i]?=?i;
????????}
????} ????public?delegate?void?Feedback(Object?value,?int?item,?int?numItems);
??//定義了一個共有委托類型Feedback,委托表示一個回調方法簽名,故Feedback委托表示一個接受3個參數,且返回值為void的回調方法
????public?void?ProcessItems(Feedback?feedback)
????{
????????for?(int?item?=?0;?item?<?items.Length;?item++)
????????{
????????????if?(feedback?!=?null)
????????????{
????????????????feedback(items[item],item+1,items.Length);
????????????}
????????}???????????????//ProcessItems方法接受一個參數feedback,然后調用由feedback變量所指定的回調方法
????}
}
1.使用委托回調靜態方法
static?void?StaticCallbacks(){
????Set?setofItems?=?new?Set(5);
????setofItems.ProcessItems(null);
????//傳遞給feedback參數的值為null,不會調用任何回調方法
????setofItems.ProcessItems(new?Set.Feedback(/**//*method*/));
????//構造一個委托對象,封裝一個方法method,這使得該方法可以通過委托封裝進行間接回調
????Set.Feedback?fb?=?null;
????fb?+=?new?Set.Feedback(/**//*method1*/);
????fb?+=?new?Set.Feedback(/**//*method2*/);
????setofItems.ProcessItems(fb);
????//委托鏈,所有回調的方法都必須接受相同參數,返回值類型
}
? 2.使用委托回調實例方法
與調用靜態方法不同的是,回調實例方法需要構造一個對象
?? App?appobj=new?App();
setOfItems.ProcessItems(new?Set.Feedback(appobj.FeedbackToFile));
?
18.異常
異常對象都包含一個描述字符串和一個堆棧蹤跡。微軟規定所有和CLS兼容的編程語言都必須能夠拋出并捕獲那些繼承自System.Exception的異常類型。
void? SomeMethod()? {
???????? try? {
???????? //需要異常恢復和資源清理的操作代碼;或可能會拋出異常的代碼????
???????? //單獨一個try塊是沒有任何意義的
}
???????? catch(異常篩選器exception filter)? {
???????? //異常恢復代碼 ,出現異常時需要執行的響應代碼
//異常篩選器本身是一個類型;代碼執行時是自上而下搜索catch塊的,應將更具體的異常放在上面,否則會產生個錯誤
}
finally {
//包含確保要執行的代碼,一般是資源清理代碼
//不管線程是否拋出異常,該代碼塊中的代碼都能確保被執行
//一個try塊并非必須要有一個finally塊相關聯,因為有時候try塊中的代碼并不需要任何清理工作;但一個try塊最多只能有一個相關聯的finally塊
}
}
異常不是錯誤,它是對程序接口隱含假設的一種違反。這里的程序接口是指屬性的數據類型,方法的參數,返回值等。通過拋出異常,一個方法可以通知它的調用程序它所做的假設被違反了。
如何正確使用異常?
a.?????? 避免過多的finally塊;C#提供了lock和using語句,是編譯器自動產生try塊和finally塊,其中finally塊就是清理代碼,它們編譯產生的結果是一樣的。
b.????? 避免直接用System.Exception異常篩選器捕獲所有異常,因為系統隨時可能拋出StackOverflowException或OutOfMemoryException
c.?????? 當異常無法修復時,回滾部分完成的操作
?
轉載于:https://www.cnblogs.com/yuxhust/archive/2009/03/15/1412490.html
總結
以上是生活随笔為你收集整理的.NET Framework学习笔记(十)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习笔记(28):Python网络编程并
- 下一篇: Page object设计模式