国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

.NET 2.0 基礎類庫中的范型——其他范型類

2024-07-10 12:59:29
字體:
來源:轉載
供稿:網友
其他范型類
.net 2.0 基礎類庫對范型的應用當然并不僅限于范型集合和 functional programming。下面所列的范型類也都有其明確的設計目的和用途。

array
在.net 2.0中,array 類擴充了對范型編程的支持。當然,array類本身并不是范型類(出于兼容的考慮),而是提供了一系列支持范型的方法。除了前面提到的 functional programming 的支持外,array 類還對以前很多基于 object 的方法提供了對應的范型版本,這樣對值類型可以提高查找和排序時的性能。例如:



static int indexof(t[] array, t value);

static void sort(t[] array);



另外,還添加了一些新的范型方法,例如:



static ilist asreadonly(t[] array); // 返回一個只讀的列表

static void resize(ref t[] array, int newsize); // 改變數組大小



還有一個好消息是,在 .net 2.0 中,數組將支持范型集合接口。我們知道,在 .net 2.0 以前,array 抽象類實現了 ilist,icollection 和 ienumerable 集合接口,這樣我們可以在需要傳入這些接口的地方傳入數組。在 .net 2.0 中,范型集合需要使用如 ienumerable<t> 這樣的范型接口,所以數組也將支持這些范型接口。然而,這些范型接口并不在 array 類中實現(因為 array 類本身并不是范型類),而是在運行時由 clr 實現。例如,對于 int[],可以按如下的偽定義理解它的實現:



class int[] : array, list<int>, icollection<int>, ienumerable<int>

arraysegment<t>
arraysegment<t> 表示數組中的一段。我們知道,c#/clr 沒有提供默認參數這一特性,而是要求使用函數重載。所以,不少類中有大量的針對數組參數(索引,長度)的重載方法(為了方便調用者),例如:



class encoding {

public virtual byte[] getbytes(char[] chars);

public virtual byte[] getbytes(char[] chars, int index, int count);

...

}



對類的設計者來說,提供如此多的重載顯得麻煩和笨拙,而且這些重載方法實際上都對應同一個實現。另外,設計如此多的虛函數也給子類的實現者帶來了不少麻煩,尤其是當這些函數是 abstract 時。

在 .net 2.0 中,微軟試圖通過提供 arraysegment<t> 類來解決這一設計問題。使用 arraysegment<t> 的話,類的設計者現在只需設計一個方法即可,即:(注意這不是 .net 2.0 的真實代碼,僅為說明問題)



class encoding {

public virtual byte[] getbytes(arraysegment<char> chars);

...

}



而由調用者來決定如何傳入數組參數,例如:



char[] chars = ...;

byte[] bytes = enc.getbytes(new arraysegment<char>(chars));



byte[] bytes = enc.getbytes(new arraysegment<char>(chars, 0, 10));



可以看到,使用 arraysegment<char> 的缺點是對使用者來說要多編寫一些代碼。可能是這個原因,所以目前 .net 中并沒有正式開始使用它。另外一個原因則可能是出于要和已有設計保持一致的考慮。

nullable<t>
nullable<t> 值類型用于表示可能無效或者不存在的值(這個類最初的命名為 optionalvalue<t>)。例如,在數據庫設計中可能有些字段是可選,數據訪問接口的設計者可以用 nullable<t> 來返回數據庫字段。nullable<t> 類有兩個只讀實例屬性 hasvalue 和 value。前者是 bool 類型用于標識是否有效,后者是 t 類型的數據。在訪問 value 之前必須先判斷 hasvalue 是否為 true,否則將拋出異常。

nullable<t> 通常用于值類型(如 nullable<datetime>),因為對引用類型來說,null 本身就可以代表無效的狀態,在這種情況下使用 nullable<t> 并沒有太多意義。

值得一提的是,c# 2.0 為 nullable<t> 類型提供了一個非常簡潔而優美的語法,即在原始類型后加 ? 后綴,也就是說,int? 等于 nullable<int>。這樣使得 nullable<t> 在 c# 中的使用非常的容易和自然(畢竟模板看起來要費眼一些j)。例如下面的代碼示例:



int? a = null; // a為空(即hasvalue屬性為false)

int? b = 10; // b為10



以后,在設計可能返回無效值的 api 時,除了以前使用的拋出異常的方法外,我們也可以使用 nullable<t>,例如:



int parsenumber(string s); // 使用異常

int? tryparsenumber(string s); // 不使用異常,而使用nullable<t>

eventhandler<t>
事件的定義和使用遍及 .net framework 的各個角落。在沒有范型的情況下,每個事件委托都要單獨定義,例如:



delegate void eventhandler(object sender, eventargs e);

delegate void keyeventhandler(object sender, keyeventargs e);



這樣的缺點是對事件定義者來說每次都要定義新的事件委托,而對使用者來說又要多學習和記憶新的事件委托。在 .net 2.0 中,引入了 eventhandler 范型事件委托來解決這個問題,它的原型如下(注意它位于 system.collections.generic 命名空間中):



delegate void eventhandler(object sender, t e) where t: eventargs;



使用 eventhandler 的話,就不需要自己定義新的事件委托了,僅需提供自己的事件參數類即可(需要從 eventargs 派生)。這樣的好處一方面是可用性更好(無論對事件定義者還是使用者),另外從 clr 的角度來說,因為這個范型委托編譯后對所有 t 類型都只對應一個二進制實現,所以會提高系統的整體性能。所以,在微軟最新的設計指南中,建議事件委托使用 eventhandler<t>。使用 eventhandler<t> 的代碼示例如下:



class myeventargs : eventargs {

...

}



class foo {

public event eventhandler<myeventargs> myevent;

...

}



foo foo = new foo();

foo.myevent += new eventhandler<myeventargs>(this.myeventhandler);

...

  • 本文來源于網頁設計愛好者web開發社區http://www.html.org.cn收集整理,歡迎訪問。
  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    主站蜘蛛池模板: 宁南县| 康平县| 迁西县| 盖州市| 肃宁县| 偃师市| 旬阳县| 石泉县| 沅陵县| 普安县| 莫力| 精河县| 定西市| 贵溪市| 广平县| 横山县| 布尔津县| 神池县| 旺苍县| 商洛市| 政和县| 广宁县| 紫阳县| 龙里县| 廊坊市| 石渠县| 福建省| 青浦区| 彩票| 翁源县| 泗阳县| 田林县| 延庆县| 天水市| 淮北市| 富蕴县| 元谋县| 盈江县| 广汉市| 三亚市| 丰顺县|