六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

.NET 2.0 基礎(chǔ)類(lèi)庫(kù)中的范型——其他范型類(lèi)

[摘要]其他范型類(lèi).NET 2.0 基礎(chǔ)類(lèi)庫(kù)對(duì)范型的應(yīng)用當(dāng)然并不僅限于范型集合和 Functional Programming。下面所列的范型類(lèi)也都有其明確的設(shè)計(jì)目的和用途。Array在.NET 2.0中,Array 類(lèi)擴(kuò)充了對(duì)范型編程的支持。當(dāng)然,Array類(lèi)本身并不是范型類(lèi)(出于兼容的考慮),而是提供...
其他范型類(lèi)
.NET 2.0 基礎(chǔ)類(lèi)庫(kù)對(duì)范型的應(yīng)用當(dāng)然并不僅限于范型集合和 Functional Programming。下面所列的范型類(lèi)也都有其明確的設(shè)計(jì)目的和用途。

Array
在.NET 2.0中,Array 類(lèi)擴(kuò)充了對(duì)范型編程的支持。當(dāng)然,Array類(lèi)本身并不是范型類(lèi)(出于兼容的考慮),而是提供了一系列支持范型的方法。除了前面提到的 Functional Programming 的支持外,Array 類(lèi)還對(duì)以前很多基于 object 的方法提供了對(duì)應(yīng)的范型版本,這樣對(duì)值類(lèi)型可以提高查找和排序時(shí)的性能。例如:



static int IndexOf(T[] array, T value);

static void Sort(T[] array);



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



static IList AsReadOnly(T[] array); // 返回一個(gè)只讀的列表

static void Resize(ref T[] array, int newSize); // 改變數(shù)組大小



還有一個(gè)好消息是,在 .NET 2.0 中,數(shù)組將支持范型集合接口。我們知道,在 .NET 2.0 以前,Array 抽象類(lèi)實(shí)現(xiàn)了 IList,ICollection 和 IEnumerable 集合接口,這樣我們可以在需要傳入這些接口的地方傳入數(shù)組。在 .NET 2.0 中,范型集合需要使用如 IEnumerable<T> 這樣的范型接口,所以數(shù)組也將支持這些范型接口。然而,這些范型接口并不在 Array 類(lèi)中實(shí)現(xiàn)(因?yàn)?Array 類(lèi)本身并不是范型類(lèi)),而是在運(yùn)行時(shí)由 CLR 實(shí)現(xiàn)。例如,對(duì)于 int[],可以按如下的偽定義理解它的實(shí)現(xiàn):



class int[] : Array, List<int>, ICollection<int>, IEnumerable<int>

ArraySegment<T>
ArraySegment<T> 表示數(shù)組中的一段。我們知道,C#/CLR 沒(méi)有提供默認(rèn)參數(shù)這一特性,而是要求使用函數(shù)重載。所以,不少類(lèi)中有大量的針對(duì)數(shù)組參數(shù)(索引,長(zhǎng)度)的重載方法(為了方便調(diào)用者),例如:



class Encoding {

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

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

...

}



對(duì)類(lèi)的設(shè)計(jì)者來(lái)說(shuō),提供如此多的重載顯得麻煩和笨拙,而且這些重載方法實(shí)際上都對(duì)應(yīng)同一個(gè)實(shí)現(xiàn)。另外,設(shè)計(jì)如此多的虛函數(shù)也給子類(lèi)的實(shí)現(xiàn)者帶來(lái)了不少麻煩,尤其是當(dāng)這些函數(shù)是 abstract 時(shí)。

在 .NET 2.0 中,微軟試圖通過(guò)提供 ArraySegment<T> 類(lèi)來(lái)解決這一設(shè)計(jì)問(wèn)題。使用 ArraySegment<T> 的話(huà),類(lèi)的設(shè)計(jì)者現(xiàn)在只需設(shè)計(jì)一個(gè)方法即可,即:(注意這不是 .NET 2.0 的真實(shí)代碼,僅為說(shuō)明問(wèn)題)



class Encoding {

public virtual byte[] GetBytes(ArraySegment<char> chars);

...

}



而由調(diào)用者來(lái)決定如何傳入數(shù)組參數(shù),例如:



char[] chars = ...;

byte[] bytes = enc.GetBytes(new ArraySegment<char>(chars));



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



可以看到,使用 ArraySegment<char> 的缺點(diǎn)是對(duì)使用者來(lái)說(shuō)要多編寫(xiě)一些代碼。可能是這個(gè)原因,所以目前 .NET 中并沒(méi)有正式開(kāi)始使用它。另外一個(gè)原因則可能是出于要和已有設(shè)計(jì)保持一致的考慮。

Nullable<T>
Nullable<T> 值類(lèi)型用于表示可能無(wú)效或者不存在的值(這個(gè)類(lèi)最初的命名為 OptionalValue<T>)。例如,在數(shù)據(jù)庫(kù)設(shè)計(jì)中可能有些字段是可選,數(shù)據(jù)訪問(wèn)接口的設(shè)計(jì)者可以用 Nullable<T> 來(lái)返回?cái)?shù)據(jù)庫(kù)字段。Nullable<T> 類(lèi)有兩個(gè)只讀實(shí)例屬性 HasValue 和 Value。前者是 bool 類(lèi)型用于標(biāo)識(shí)是否有效,后者是 T 類(lèi)型的數(shù)據(jù)。在訪問(wèn) Value 之前必須先判斷 HasValue 是否為 true,否則將拋出異常。

Nullable<T> 通常用于值類(lèi)型(如 Nullable<DateTime>),因?yàn)閷?duì)引用類(lèi)型來(lái)說(shuō),null 本身就可以代表無(wú)效的狀態(tài),在這種情況下使用 Nullable<T> 并沒(méi)有太多意義。

值得一提的是,C# 2.0 為 Nullable<T> 類(lèi)型提供了一個(gè)非常簡(jiǎn)潔而優(yōu)美的語(yǔ)法,即在原始類(lèi)型后加 ? 后綴,也就是說(shuō),int? 等于 Nullable<int>。這樣使得 Nullable<T> 在 C# 中的使用非常的容易和自然(畢竟模板看起來(lái)要費(fèi)眼一些J)。例如下面的代碼示例:



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

int? b = 10; // b為10



以后,在設(shè)計(jì)可能返回?zé)o效值的 API 時(shí),除了以前使用的拋出異常的方法外,我們也可以使用 Nullable<T>,例如:



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

int? TryParseNumber(string s); // 不使用異常,而使用Nullable<T>

EventHandler<T>
事件的定義和使用遍及 .NET Framework 的各個(gè)角落。在沒(méi)有范型的情況下,每個(gè)事件委托都要單獨(dú)定義,例如:



delegate void EventHandler(object sender, EventArgs e);

delegate void KeyEventHandler(object sender, KeyEventArgs e);



這樣的缺點(diǎn)是對(duì)事件定義者來(lái)說(shuō)每次都要定義新的事件委托,而對(duì)使用者來(lái)說(shuō)又要多學(xué)習(xí)和記憶新的事件委托。在 .NET 2.0 中,引入了 EventHandler 范型事件委托來(lái)解決這個(gè)問(wèn)題,它的原型如下(注意它位于 System.Collections.Generic 命名空間中):



delegate void EventHandler(object sender, T e) where T: EventArgs;



使用 EventHandler 的話(huà),就不需要自己定義新的事件委托了,僅需提供自己的事件參數(shù)類(lèi)即可(需要從 EventArgs 派生)。這樣的好處一方面是可用性更好(無(wú)論對(duì)事件定義者還是使用者),另外從 CLR 的角度來(lái)說(shuō),因?yàn)檫@個(gè)范型委托編譯后對(duì)所有 T 類(lèi)型都只對(duì)應(yīng)一個(gè)二進(jìn)制實(shí)現(xiàn),所以會(huì)提高系統(tǒng)的整體性能。所以,在微軟最新的設(shè)計(jì)指南中,建議事件委托使用 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);

...


主站蜘蛛池模板: 亚洲欧美精品一区二区 | 天天操天天摸天天曰天天干天天弄天天干 | 午夜在线免费观看 | 日本一区二区三区四区五区 | 日韩亚洲欧美综合 | 亚洲欧美日韩在线观看二区 | 视频精品一区二区 | 四虎在线永久免费观看 | 午夜黄色毛片 | 天天天天天干 | 亚洲婷婷六月 | 午夜影院福利 | 在线视频二区 | 一二三四视频日本高清 | 青草社区视频 | 先锋资源久久 | 人人揉人人添人人捏人人看 | 亚洲欧美在线综合一区二区三区 | 在线天堂中文在线网 | 天天躁夜夜躁很很躁 | 日韩欧美精品在线视频 | 欧美一二三 | 日本中文字幕在线视频站 | 手机看片精品高清国产日韩 | 日韩操 | 日韩在线视频中文字幕 | 四虎影院精品在线观看 | 亚洲高清免费观看 | 欧美一级二级三级视频 | 中文字幕一区二区三区四区五区人 | 日韩三级黄 | 特黄特黄aaaa级毛片免费看 | 亚洲六区| 午夜视频在线观看免费视频 | 青青操在线视频 | 青青草影院在线观看 | 天天噜噜揉揉狠狠夜夜 | 在线播放精品视频 | 青娱极品盛宴国产精品分类 | 亚洲第五页 | 青娱乐自拍 |