C#2.0 Specification(泛型一)

來源:互聯網
上載者:User

由於這一章非常長可能需要分幾篇:)

20.泛型

20.1泛型類聲明

泛型類聲明是一個需要提供型別參數以形成實際類型的類的聲明。



類聲明可以有選擇地定義型別參數。

class-declaration: (類聲明)
attributesopt class-modifiersopt class identifieropt type-parameter-listopt class –baseopt type-parameter-constraints-clauseopt class-body;opt (特性可選 類修飾符可選 類別識別項可選 型別參數列表可選 基類可選 型別參數約束語句可選 類體; 可選 )
除非提供了型別參數列表,類聲明可以不提供型別參數化約束語句。

提供了型別參數列表的類聲明是一個泛型類聲明。此外,任何嵌入到泛型類聲明或泛型結構聲明中的類,自身是一個泛型類聲明,因為必須提供包含類型的型別參數以建立構造類型(constructed type);

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

class List<T>{}
這是構造類型的一些例子,List<T>,List<int>和List<List<string>>。構造類型可以使用一個或多個參數,例如List<T>被稱為開放構造類型(open constructed type)。不使用型別參數的構造類型,例如List<int>被稱為封閉構造類型(closed constructed type)。

泛型型別不可以被“重載”;也就是說,和普通類型一樣在一個範圍內,泛型型別必須被唯一地命名。


class C{}
class C<V>{}//錯誤,C定義了兩次
class C<U,V>{}//錯誤,C定義了兩次
然而在非限定類型名字尋找(§20.9.3)中使用的類型尋找規則和成員訪問(§20.9.4),確實考慮到了型別參數的個數。

20.1.1型別參數

型別參數可以在一個類聲明上提供。每個型別參數是一個簡單的標識符,它指示了用來建立一個構造類型的型別參數的預留位置。型別參數是在後面將要被提供的類型的形式預留位置。相反,型別參數§20.5.1)只是在構造類型被引用時,實際類型的一個替代。

type-parameter-list:(型別參數列表:)
<type-parameters> (<型別參數>)
type-parameters:(型別參數:)
type-parameter(型別參數)
type-parameters type-parameter(型別參數,型別參數)
type-parameter:(型別參數:)
attributesopt identifier(特性可選 標識符)

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

在一個類中的型別參數的範圍(§3.7),包括基類 、 型別參數約束語句和類體。不像類的成員,它沒有擴充到衍生類別。在其範圍之內,型別參數可以被用作一個類型。

type(類型):

value-type(實值型別)
reference-type(參考型別)
type-parameter(型別參數)
由於型別參數可以被許多不同的實際類型實參所執行個體化,型別參數與其他類型相比將略微有一些不同的操作和限制。包括如下內容。

型別參數不能用於直接聲明一個基底類型或者介面
對於在型別參數上的成員尋找規則,如果約束存在,則依賴於應用到該型別參數的約束。更詳細地說明參看§20.7.4。



型別參數可行的轉換依賴於應用到該型別參數上的約束(如果有的話)。詳細地說明參看§20.7.4。
字面null不能被轉換到由型別參數所給定的類型,除非型別參數是由一個類約束(§20.7.4)所約束。然而可以使用一個預設值運算式(§20.8.1)代替。此外,由一個型別參數給定的類型的值可以使用“==”和“!=”(§20.8.4)與null進行比較。
如果型別參數通過一個建構函式約束(constructor-constraint)(§20.7)而約束,new運算式只能用過一個型別參數而被使用。
型別參數不能用於特性內的任何地方。
型別參數不能用於成員訪問,或者表示一個靜態成員或者巢狀型別的類型名字(§20.9.1、§20.9.4)。
在不安全的程式碼中,型別參數不能被用作託管類型(§18.2)。

作為一種類型,型別參數純粹只是一個編譯時間構件。在運行時,每個型別參數被綁定到運行時類型,它是通過泛型型別聲明所提供的類型實參所指定的。為此,在運行時,使用型別參數聲明的變數類型是一個封閉類型(closed type)(§20.5.2)。所有語句和運算式在運行時執行所使用的型別參數,都是由那個參數作為類型實參而提供的實際類型。

20.1.2執行個體類型

每個類聲明都有與之關聯的構造類型,即執行個體類型(instance type)。對於一個泛型類聲明,執行個體類型通過建立一個來自於型別宣告的構造類型(§20.4)而形成,它使用對應於型別參數的每一個類型實參。由於執行個體化類型使用型別參數,在型別參數範圍內(類聲明之內),它是唯一有效。執行個體類型在類聲明中是this的類型。對於非泛型類,執行個體類型只是一個宣告類型。下面展示了幾個聲明類,以及它們的執行個體類型。

class A<T> //執行個體類型:A<T>{class B{} //執行個體類型:A<T>.Bclass C<U>{} //執行個體類型:A<T>.C<U>}class D{} //執行個體類型:D

20.1.3基類規範

在類聲明中指定的基類可以是一個構造類型(§20.5)。一個基類其自身不能是一個型別參數,但在其範圍內可以包含型別參數。


class Extend<V>: V{}//錯誤,型別參數被用作基類
泛型類聲明不能使用System.Attribute作為直接或間接基類。

在一個類聲明中指定的基底介面可以是構造介面類型(§20.5)。基底介面自身不能是型別參數,但在其範圍內可以包含型別參數,下面的代碼示範了如何?和擴充構造類型。

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中所描述的唯一性規則。

從基類或介面重寫或實現方法的類的方法,必須提供特定類型的合適方法。下面的代碼示範了方法如何被重寫和實現。這將會在§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泛型類的成員

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


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); //列印1C<double> x2 = new C<double>(3.1415);Console.WriteLine(x2.f1); //列印 3.1415}}

在執行個體函數成員之內,this的類型就是聲明的執行個體類型(§20.1.2)。

除了使用型別參數作為類型和成員,在泛型類聲明中也遵循和非泛型類成員相同的規則。適用於特定種類成員的附加規則將在後面幾節進行討論。

20.1.5泛型類中的靜態欄位

在一個泛型類聲明中的靜態變數,在相同封閉構造類型(§20.5.2)所有執行個體中被共用,但在不同封閉構造類型的執行個體中[1],是不被共用的。這些規則不管靜態變數的類型包含那種型別參數都適用。

例如

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);//列印 1C<double> x2 = new C<double>();Console.WriteLine(C<int>.Count);//列印 1C<int> x3 = new C<int>();Console.WriteLine(C<int>.Count);//列印 2}}

[1] 這是很容易理解的,因為在運行時,不同的封閉構造類型,是屬於不同的類型,比如List<int> 和List<string> 這二者的執行個體是不能共用靜態變數的。

以上就是C#2.0 Specification(泛型一)的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.