看到他我一下子就悟了 泛型(1)

2022-01-14 16:02:04 字數 4164 閱讀 5272

1.泛型概念:

本質上,

術語」泛型」指的是」引數化型別(parameterized types)」.引數化型別非常重要

,因為它們可以在建立類.結構

.方法和委託的時候將要操作的資料型別作為參

數進行指定

.使用引數化型別的類.結構

.方法和委託都可以稱為泛型

,如」泛型類」或者」泛型方法」.

在具體宣告乙個變數或者例項化之前,型別引數t

只是乙個佔位符。等到具體宣告和例項化的時候,編譯器要求**指定型別引數。泛型型別宣告了泛型

數佔位符型別

,由泛型型別的使用者填寫這些佔位符

,並作為泛型的引數提供給泛型型別

.

2.泛型約束:約束宣告了泛型要求的型別引數的特徵。

為了宣告乙個約束,

需要使用where

關鍵字,

後跟一對」引數:

要求」.其中,」引數」必須是泛型型別中定義的乙個引數,

而」要求」用於限制型別從

中」派生」的類或接

口,或者限制必須存在乙個預設構造器

,或者限制使用乙個引用

/值型別約束

.2.1

基類約束(where t:base-class-name

)

有的時候,你可能需要限制型別從乙個特定的類派生.這是用基類約束(base class constraint)做到的.使用基類約束,可以指定某個型別實參

必須繼承的基類.基類約束有兩個重要功能.

首先,他允許在泛型類中使用由約束指定的基類所定義的成員.例如,可以呼叫基類的方法或者使用基類的屬性.如果沒有基類約束,編譯器就無法知道某

個型別實參擁有哪些成員.通過提供基類約束,編譯器將知道所有的型別實參都擁有由指定的基類所定義的成員.

基類約束的第二個功能是,確保只適用支援指定基類的型別實參.這意味著對於任意給定的基類約束,型別實參要麼是基類本身,要麼是派生於該基

類.如果

試圖使用沒有匹配或者繼承指定的型別實參,就會導致編譯錯誤 例:

using system;

using system.collections.generic;

using system.linq;

using system.text;

//泛型:基類約束

//基類約束兩個作用:1.基類約束允許泛型類訪問基類的成員

// 2.確保只能使用滿足該約束的型別引數,從而實現型別安全

namespace generic

public string name

public phonenumber(string n, string num)

}///

/// 朋友**

///

class friend : phonenumber

public friend(string n, string num, bool wk)

: base(n, num)

}///

/// **商**

///

class supplier : phonenumber

}/*為了管理**列表,下面建立乙個名為phonelist的類.由於希望該類能夠

* 管理任意型別的**列表,因此將其實現為泛型.另外,由於列表管理的一部分內容是

* 根據姓名查詢號碼,或者根據號碼查詢姓名,因此要給它新增約束,從而

* 確保儲存在列表中的物件的型別必須是phonenumber派生類的例項

*////

/// 管理任意型別的**列表

///

///

class phonelistwhere t:phonenumber

public bool add(t newentry)

public t findbyname(string name)

throw new notfoundexception();

}public t findbynumber(string number)

throw new notfoundexception();}}

///

/// 此類沒有繼承phonenumber,因此不能用於建立phonelist

///

class emailfriend

/** 這是乙個定製異常,雖然該示例只使用預設建構函式,但是出於說明的

* 目的,notfoundexception實現了exception定義的所有建構函式

* 注意:這些建構函式只呼叫了exception定義的相等基類建構函式.

* notfoundexception沒有向exception新增任何內容,因此不需要

* 執行任何進一步的操作

*/ class notfoundexception : exception

public notfoundexception(string str):base( str){}

public notfoundexception(string str, exception inner) :

base(str, inner)

protected notfoundexception(

system.runtime.serialization.serializationinfo si,

system.runtime.serialization.streamingcontext se) :

base(si, se) }}

怎樣呼叫:

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.collections;

namespace

generic

//基類約束

public

static

void

baseclassconstraint()

);//正確新增

plist.add(new friend("

tom", "

5555-333

", true

)); plist.add(

new friend("

gary

", "

5555-332

", true

)); plist.add(

new friend("

wangc

", "

5555-331

", false

));

try

catch

(notfoundexception)

//**商

phonelistplist2 = new phonelist();

plist2.add(

new supplier("

global hardware

", "

400-123

"));

plist2.add(

new supplier("

computer

", "

400-124

"));

plist2.add(

new supplier("

networkcity

", "

400-125

"));

try

catch

(notfoundexception)

//沒有繼承的

//phonelistplist3 = new phonelist();

} }

}

未完待續……

看到他我一下子就悟了 委託

不用先看例子什麼的,你就多品味品味這句話,然後你看下使用委託的步驟,1.定義乙個委託 2.註冊該委託 3.使用委託 它們就像是一道檻兒,過了這個檻的人,覺得真是太容易了,而沒有過去的人每次見到委託和事件就覺得心裡憋得慌,渾身不自在 其實不用怕,你就按著這三步來標準沒錯,下面來個小例子 第一步 定義委...

看到他我一下子就悟了 委託

不用先看例子什麼的,你就多品味品味這句話,然後你看下使用委託的步驟,1.定義乙個委託 2.註冊該委託 3.使用委託 它們就像是一道檻兒,過了這個檻的人,覺得真是太容易了,而沒有過去的人每次見到委託和事件就覺得心裡憋得慌,渾身不自在 其實不用怕,你就按著這三步來標準沒錯,下面來個小例子 第一步 定義委...

Python機器學習為啥就一下子紅遍全球了呢???

在這篇文章中我們會講python的重要特徵和它適用於機器學習的原因,介紹一些重要的機器學習包,以及其他你可以獲取更詳細資源的地方。為什麼用python做機器學習 python很適合用於機器學習。首先,它很簡單。如果你完全不熟悉python但是有一些其他的程式設計經驗 c或者其他程式語言 要上手是很快...