淺析c#范型中的特殊關(guān)鍵字where & default
在看源碼的時(shí)候看見了where和default,雖說(shuō)default很常見,但是它的用法我卻是第一次看到,哎,基礎(chǔ)不扎實(shí)??!
下面介紹下這兩個(gè)特殊的關(guān)鍵字:
一、Where關(guān)鍵字
where 子句用于指定類型約束,這些約束可以作為泛型聲明中定義的類型參數(shù)的變量。
1.接口約束。
例如,可以聲明一個(gè)泛型類 MyGenericClass,這樣,類型參數(shù) T 就可以實(shí)現(xiàn) IComparable<T> 接口:
publicclassMyGenericClass<T>whereT:IComparable{}
2.基類約束:指出某個(gè)類型必須將指定的類作為基類(或者就是該類本身),才能用作該泛型類型的類型參數(shù)。
這樣的約束一經(jīng)使用,就必須出現(xiàn)在該類型參數(shù)的所有其他約束之前。
class MyClassy<T,U>
whereT:class03.whereU:struct04.{
}
3.where 子句還可以包括構(gòu)造函數(shù)約束。
可以使用 new 運(yùn)算符創(chuàng)建類型參數(shù)的實(shí)例;但類型參數(shù)為此必須受構(gòu)造函數(shù)約束 new() 的約束。new() 約束可以讓編譯器知道:提供的任何類型參數(shù)都必須具有可訪問的無(wú)參數(shù)(或默認(rèn))構(gòu)造函數(shù)。例如:
publicclassMyGenericClass<T>whereT:IComparable,new()
{
//Thefollowinglineisnotpossiblewithoutnew()constraint:04.Titem=newT();
}
new() 約束出現(xiàn)在 where 子句的最后。
4.對(duì)于多個(gè)類型參數(shù),每個(gè)類型參數(shù)都使用一個(gè) where 子句
例如:
interface MyI{}
class Dictionary<TKey,TVal>
whereTKey:IComparable,IEnumerable
whereTVal:MyI
{
publicvoidAdd(TKeykey,TValval)
{
}
}
5.還可以將約束附加到泛型方法的類型參數(shù),例如:
public bool MyMethod<T>(Tt)whereT:IMyInterface{}
請(qǐng)注意,對(duì)于委托和方法兩者來(lái)說(shuō),描述類型參數(shù)約束的語(yǔ)法是一樣的:
delegateTMyDelegate<T>()whereT:new()
總之,Where就是為范型指定類型約束。
二、Default關(guān)鍵字
在泛型類和泛型方法中產(chǎn)生的一個(gè)問題是,在預(yù)先未知以下情況時(shí),如何將默認(rèn)值分配給參數(shù)化類型 T:
T 是引用類型還是值類型。
如果 T 為值類型,則它是數(shù)值還是結(jié)構(gòu)。
給定參數(shù)化類型 T 的一個(gè)變量 t,只有當(dāng) T 為引用類型時(shí),語(yǔ)句 t = null 才有效;只有當(dāng) T 為數(shù)值類型而不是結(jié)構(gòu)時(shí),語(yǔ)句 t = 0 才能正常使用。
解決方案是使用 default 關(guān)鍵字,此關(guān)鍵字對(duì)于引用類型會(huì)返回空,對(duì)于數(shù)值類型會(huì)返回零。對(duì)于結(jié)構(gòu),此關(guān)鍵字將返回初始化為零或空的每個(gè)結(jié)構(gòu)成員,具體取決于這些結(jié)構(gòu)是值類型還是引用類型。以下來(lái)自 GenericList<T> 類的示例顯示了如何使用 default 關(guān)鍵字。
public class GenericList<T>
{
private class Node
{
//...06.07. public Node Next;
public T Data;
}
private Node head;
//...14.15. public T GetNext()
{
T temp = default(T);
Node current = head;
if (current != null)
{
temp = current.Data;
current = current.Next;
}
return temp;
}
}
2. default 另一種用法
在switch語(yǔ)句中,如果沒有任何 case 表達(dá)式與開關(guān)值匹配,則控制傳遞給跟在可選 default 標(biāo)簽后的語(yǔ)句。如果沒有 default 標(biāo)簽,則控制傳遞到 switch 以外。
int id = int32.Parse(Console.ReadLine());
switch (id)
{
case 1:
Console.WriteLine("Lee");
break;
case 2:
Console.WriteLine("Tang");
break;
default:
Console.WriteLine("Sorry, no one match this ID!");
break;
}
where 子句還可以包括構(gòu)造函數(shù)約束??梢允褂?new 運(yùn)算符創(chuàng)建類型參數(shù)的實(shí)例;但類型參數(shù)為此必須受構(gòu)造函數(shù)約束 new() 的約束。
new() 約束可以讓編譯器知道:提供的任何類型參數(shù)都必須具有可訪問的無(wú)參數(shù)(或默認(rèn))構(gòu)造函數(shù)。
new() 約束出現(xiàn)在 where 子句的最后。
對(duì)于多個(gè)類型參數(shù),每個(gè)類型參數(shù)都使用一個(gè) where 子句
還可以將約束附加到泛型方法的類型參數(shù)
請(qǐng)注意,對(duì)于委托和方法兩者來(lái)說(shuō),描述類型參數(shù)約束的語(yǔ)法是一樣的
相關(guān)文章
C#使用Task實(shí)現(xiàn)執(zhí)行并行任務(wù)的原理的示例詳解
Task是一個(gè)表示異步操作的類,它提供了一種簡(jiǎn)單、輕量級(jí)的方式來(lái)創(chuàng)建多線程應(yīng)用程序。本文就來(lái)和大家聊聊在C#中如何使用Task執(zhí)行并行任務(wù)吧2023-04-04C#對(duì)XML文件的各種操作實(shí)現(xiàn)方法
C#對(duì)XML文件的各種操作實(shí)現(xiàn)方法,需要的朋友可以參考一下2013-04-04WPF利用LiveCharts實(shí)現(xiàn)動(dòng)態(tài)曲線圖繪制
LiveCharts是一個(gè)比較漂亮的WPF圖表控件,在數(shù)據(jù)發(fā)生變化后,還可以設(shè)置相對(duì)于的動(dòng)畫效果,本文就來(lái)利用LiveCharts繪制簡(jiǎn)單的動(dòng)態(tài)曲線圖吧2023-10-10C#使用MD5算法對(duì)密碼進(jìn)行加密的示例代碼
MD5(Message Digest Algorithm 5)是一種被廣泛使用的“消息-摘要算法”,“消息-摘要算法”實(shí)際上就是一個(gè)單項(xiàng)散列函數(shù),數(shù)據(jù)塊經(jīng)過單向散列函數(shù)得到一個(gè)固定長(zhǎng)度的散列值,本文給大家介紹了C#使用MD5算法對(duì)密碼進(jìn)行加密,需要的朋友可以參考下2024-03-03C#實(shí)現(xiàn)完善Excel不規(guī)則合并單元格數(shù)據(jù)導(dǎo)入的示例代碼
本文主要介紹了C#實(shí)現(xiàn)完善Excel不規(guī)則合并單元格數(shù)據(jù)導(dǎo)入的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02C#算法設(shè)計(jì)之關(guān)于1000瓶水的問題
這篇文章主要介紹了C#算法設(shè)計(jì)之關(guān)于1000瓶水的問題,是一個(gè)比較經(jīng)典的算法問題,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01關(guān)于C# Math 處理奇進(jìn)偶不進(jìn)的實(shí)現(xiàn)代碼
下面小編就為大家?guī)?lái)一篇關(guān)于C# Math 處理奇進(jìn)偶不進(jìn)的實(shí)現(xiàn)代碼。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2016-05-05C#使用晚綁定來(lái)實(shí)現(xiàn)壓縮Access數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了C#使用晚綁定來(lái)實(shí)現(xiàn)壓縮Access數(shù)據(jù)庫(kù)的方法,項(xiàng)目開發(fā)中有一定的實(shí)用價(jià)值,需要的朋友可以參考下2014-08-08