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

首頁 > 開發(fā) > 綜合 > 正文

C#2.0 Specification(泛型一)

2024-07-21 02:20:02
字體:
供稿:網(wǎng)友


這篇文章是翻譯的微軟的技術(shù)文章.供學習c#的朋友參考,請勿用于商業(yè)目的。http://msdn.microsoft.com/vcsharp/team/language/default.aspx
由于這一章非常長可能需要分幾篇:)
20.泛型
20.1泛型類聲明
泛型類聲明是一個需要提供類型參數(shù)以形成實際類型的類的聲明。



類聲明可以有選擇地定義類型參數(shù)。

class-declaration: (類聲明)

attributesopt class-modifiersopt class identifieropt type-parameter-listopt class –baseopt type-parameter-constraints-clauseopt class-body;opt (特性可選 類修飾符可選 類標識符可選 類型參數(shù)列表可選 基類可選 類型參數(shù)約束語句可選 類體; 可選 )

除非提供了類型參數(shù)列表,類聲明可以不提供類型參數(shù)化約束語句。

提供了類型參數(shù)列表的類聲明是一個泛型類聲明。此外,任何嵌入到泛型類聲明或泛型結(jié)構(gòu)聲明中的類,自身是一個泛型類聲明,因為必須提供包含類型的類型參數(shù)以創(chuàng)建構(gòu)造類型(constructed type);

泛型類通過使用構(gòu)造類型而被引用(§20.5)。給定泛型類聲明

class list<t>{}

這是構(gòu)造類型的一些例子,list<t>,list<int>和list<list<string>>。構(gòu)造類型可以使用一個或多個參數(shù),例如list<t>被稱為開放構(gòu)造類型(open constructed type)。不使用類型參數(shù)的構(gòu)造類型,例如list<int>被稱為封閉構(gòu)造類型(closed constructed type)。



泛型類型不可以被“重載”;也就是說,和普通類型一樣在一個作用域內(nèi),泛型類型必須被唯一地命名。





class c{}

class c<v>{}//錯誤,c定義了兩次

class c<u,v>{}//錯誤,c定義了兩次

然而在非限定類型名字查找(§20.9.3)中使用的類型查找規(guī)則和成員訪問(§20.9.4),確實考慮到了類型參數(shù)的個數(shù)。

20.1.1類型參數(shù)
類型參數(shù)可以在一個類聲明上提供。每個類型參數(shù)是一個簡單的標識符,它指示了用來創(chuàng)建一個構(gòu)造類型的類型參數(shù)的占位符。類型參數(shù)是在后面將要被提供的類型的形式占位符。相反,類型參數(shù)§20.5.1)只是在構(gòu)造類型被引用時,實際類型的一個替代。



type-parameter-list:(類型參數(shù)列表:)

<type-parameters> (<類型參數(shù)>)

type-parameters:(類型參數(shù):)

type-parameter(類型參數(shù))

type-parameters type-parameter(類型參數(shù),類型參數(shù))

type-parameter:(類型參數(shù):)

attributesopt identifier(特性可選 標識符)



在類聲明中的每個類型參數(shù)在類的聲明空間(§3.3)定義了一個名字。由此,它不能和另一個類型參數(shù)或在類中聲明的成員有同樣的名字。類型參數(shù)不能和類型自身有同樣的名字。

在一個類中的類型參數(shù)的作用域(§3.7),包括基類 、 類型參數(shù)約束語句和類體。不像類的成員,它沒有擴展到派生類。在其作用域之內(nèi),類型參數(shù)可以被用作一個類型。

type(類型):

value-type(值類型)

reference-type(引用類型)

type-parameter(類型參數(shù))

由于類型參數(shù)可以被許多不同的實際類型實參所實例化,類型參數(shù)與其他類型相比將略微有一些不同的操作和限制。包括如下內(nèi)容。

類型參數(shù)不能用于直接聲明一個基類型或者接口
對于在類型參數(shù)上的成員查找規(guī)則,如果約束存在,則依賴于應(yīng)用到該類型參數(shù)的約束。更詳細地說明參看§20.7.4。




類型參數(shù)可行的轉(zhuǎn)換依賴于應(yīng)用到該類型參數(shù)上的約束(如果有的話)。詳細地說明參看§20.7.4。
字面null不能被轉(zhuǎn)換到由類型參數(shù)所給定的類型,除非類型參數(shù)是由一個類約束(§20.7.4)所約束。然而可以使用一個默認值表達式(§20.8.1)代替。此外,由一個類型參數(shù)給定的類型的值可以使用“==”和“!=”(§20.8.4)與null進行比較。
如果類型參數(shù)通過一個構(gòu)造函數(shù)約束(constructor-constraint)(§20.7)而約束,new表達式只能用過一個類型參數(shù)而被使用。
類型參數(shù)不能用于特性內(nèi)的任何地方。
類型參數(shù)不能用于成員訪問,或者表示一個靜態(tài)成員或者嵌套類型的類型名字(§20.9.1、§20.9.4)。
在不安全代碼中,類型參數(shù)不能被用作托管類型(§18.2)。
作為一種類型,類型參數(shù)純粹只是一個編譯時構(gòu)件。在運行時,每個類型參數(shù)被綁定到運行時類型,它是通過泛型類型聲明所提供的類型實參所指定的。為此,在運行時,使用類型參數(shù)聲明的變量類型是一個封閉類型(closed type)(§20.5.2)。所有語句和表達式在運行時執(zhí)行所使用的類型參數(shù),都是由那個參數(shù)作為類型實參而提供的實際類型。

20.1.2實例類型
每個類聲明都有與之關(guān)聯(lián)的構(gòu)造類型,即實例類型(instance type)。對于一個泛型類聲明,實例類型通過創(chuàng)建一個來自于類型聲明的構(gòu)造類型(§20.4)而形成,它使用對應(yīng)于類型參數(shù)的每一個類型實參。由于實例化類型使用類型參數(shù),在類型參數(shù)作用域內(nèi)(類聲明之內(nèi)),它是唯一有效的。實例類型在類聲明中是this的類型。對于非泛型類,實例類型只是一個聲明類型。下面展示了幾個聲明類,以及它們的實例類型。

class a<t> //實例類型:a<t>

{

class b{} //實例類型:a<t>.b

class c<u>{} //實例類型:a<t>.c<u>

}

class d{} //實例類型:d



20.1.3基類規(guī)范
在類聲明中指定的基類可以是一個構(gòu)造類型(§20.5)。一個基類其自身不能是一個類型參數(shù),但在其作用域內(nèi)可以包含類型參數(shù)。





class extend<v>: v{}//錯誤,類型參數(shù)被用作基類

泛型類聲明不能使用system.attribute作為直接或間接基類。

在一個類聲明中指定的基接口可以是構(gòu)造接口類型(§20.5)。基接口自身不能是類型參數(shù),但在其作用域內(nèi)可以包含類型參數(shù),下面的代碼演示了如何實現(xiàn)和擴展構(gòu)造類型。

class c<u,v>{}

interface i1<v>{}

class d:c<string , int>,i1<string>{}

class e<t>:c<int,t> ,i1<t>{}

泛型類型聲明的基接口必須滿足§20.3.1中所描述的唯一性規(guī)則。

從基類或接口重寫或?qū)崿F(xiàn)方法的類的方法,必須提供特定類型的合適方法。下面的代碼演示了方法如何被重寫和實現(xiàn)。這將會在§20.1.10中進一步解釋。

class c<u,v>

{

public virtual void m1(u x , list<v> y){…}

}

interface i1<v>

{

v m2(v x);

}

class d:c<string , int>,i1<string>

{

public override void m1(string x , list<int> y){…}

public string m2(string x){…}

}



20.1.4泛型類的成員
泛型類的所有成員都可以直接地或者作為構(gòu)造類型的一部分,從任何封閉類(enclosing class)中使用類型參數(shù)。當特定的封閉構(gòu)造類型在運行時被使用時,類型參數(shù)的每次使用都由構(gòu)造類型所提供的實際類型實參所代替。例如



class c<v>

{

public v f1;

public c<v> f2=null;





public c(v x){

this.f1 = x;

this.f2 = this;

}

}

class application

{

static void main(){

c<int> x1= new c<int >(1);

console.writeline(x1.f1); //打印1

c<double> x2 = new c<double>(3.1415);

console.writeline(x2.f1); //打印 3.1415

}

}

在實例函數(shù)成員之內(nèi),this的類型就是聲明的實例類型(§20.1.2)。

除了使用類型參數(shù)作為類型和成員,在泛型類聲明中也遵循和非泛型類成員相同的規(guī)則。適用于特定種類成員的附加規(guī)則將在后面幾節(jié)進行討論。

20.1.5泛型類中的靜態(tài)字段
在一個泛型類聲明中的靜態(tài)變量,在相同封閉構(gòu)造類型(§20.5.2)所有實例中被共享,但在不同封閉構(gòu)造類型的實例中[1],是不被共享的。這些規(guī)則不管靜態(tài)變量的類型包含那種類型參數(shù)都適用。

例如

class c<v>

{

static int count = 0;

public c()

{

count++;

}

public static int count{

get{return count;}

}

}

class application

{

static void main()

{

c<int> x1 = new c<int>();

console.writeline(c<int>.count);//打印 1

c<double> x2 = new c<double>();

console.writeline(c<int>.count);//打印 1

c<int> x3 = new c<int>();

console.writeline(c<int>.count);//打印 2

}

}



--------------------------------------------------------------------------------

[1] 這是很容易理解的,因為在運行時,不同的封閉構(gòu)造類型,是屬于不同的類型,比如list<int> 和list<string> 這二者的實例是不能共享靜態(tài)變量的。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 怀柔区| 韶山市| 卢龙县| 广宗县| 交口县| 江门市| 大埔区| 同江市| 三亚市| 张掖市| 彭水| 教育| 农安县| 丰台区| 仁化县| 肇州县| 白银市| 邯郸市| 镇安县| 新闻| 镇沅| 镇原县| 合山市| 乐陵市| 吴堡县| 吴忠市| 宜良县| 资源县| 麻城市| 三河市| 丰都县| 壶关县| 平原县| 南宁市| 伊吾县| 香格里拉县| 长海县| 衢州市| 海晏县| 长垣县| 洛浦县|