最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解c# 泛型類的功能

 更新時(shí)間:2020年10月30日 15:08:56   作者:一只獨(dú)行的猿  
這篇文章主要介紹了c# 泛型類的功能,幫助大家更好的理解和學(xué)習(xí)c#,感興趣的朋友可以了解下

  在泛型類中,由于不知道泛型參數(shù)T是什么類型,可能是引用類型,也可能是值類型,因此不能將null等賦予泛型類型。如何對(duì)泛型對(duì)象賦初值、如何保證泛型的正確性等,以使用泛型文檔管理器為例:

  文檔管理器用于從隊(duì)列中讀寫文檔。首先創(chuàng)建一個(gè)泛型管理器AddDocument()方法添加一個(gè)文檔到隊(duì)列中,IsDocumentAvailabe只讀屬性指示隊(duì)列中是否還有文檔。

public class DocumentManager<T>
{
  private readonly Queue<T> documentQueue = new Queue<T>();

  public void AddDocument(T doc)
  {
    lock (this)
    {
      documentQueue.Enqueue(doc);
    }
  }

  public bool IsDocumentAvailable
  {
    get { return documentQueue.Count > 0; }
  }
}

1、默認(rèn)值

  給DocumentManager<T>類添加一個(gè)GetDocument()方法,該方法以返回隊(duì)列中的一個(gè)文檔。如果隊(duì)列中存在文檔,則返回一個(gè)文檔;如果隊(duì)列中已沒有文檔,則返回默認(rèn)值。但是,對(duì)于泛型T,不能將null賦予T的對(duì)象,因?yàn)闊o法確定它是引用類型還是值類型。在C#中,為我們提供了一個(gè)default關(guān)鍵字,泛型T的對(duì)象賦予默認(rèn)值,如:引用類型為null、值類型int等為0……

public T GetDocument()
{
  T doc = default(T);
  lock (this)
  {
    if (documentQueue.Count > 0)
    {
      doc = documentQueue.Dequeue();
    }
  }
  return doc;
}

2、約束

  如果泛型類需要調(diào)用泛型類型中的方法,那么必須對(duì)泛型添加約束。否則,不能確保聲明的泛型類型實(shí)現(xiàn)了對(duì)應(yīng)的類型,具有相關(guān)方法。創(chuàng)建文檔類Document,其實(shí)現(xiàn)了接口IDocument:

public interface IDocument
{
  string Title { get; set; }
  string Content { get; set; }
}

public class Document : IDocument
{
  public Document()
  {
  }

  public Document(string title, string content)
  {
    this.Title = title;
    this.Content = content;
  }

  public string Title { get; set; }
  public string Content { get; set; }
}

  給泛型文檔管理器DocumentManager<T>添加方法DisplayAllDocuments(),使得隊(duì)列中所有文檔的標(biāo)題能展示出。在展示文檔標(biāo)題前,將類型T強(qiáng)制轉(zhuǎn)換為IDocumnet接口,以顯示標(biāo)題:

public void DisplayAllDocuments()
{
  foreach (T doc in documentQueue)
  {
    Console.WriteLine((doc as IDocument).Title);//強(qiáng)制轉(zhuǎn)換
  }
}

  但是,如果類型T沒有實(shí)現(xiàn)接口IDocument,在對(duì)類型進(jìn)行強(qiáng)制轉(zhuǎn)換時(shí)就會(huì)出現(xiàn)一個(gè)異常。如果對(duì)方法添加rty……catch處理,將非常損耗性能。同樣的,即使類型實(shí)現(xiàn)了接口IDocument,在進(jìn)行轉(zhuǎn)換時(shí)也會(huì)出現(xiàn)性能的損耗。

  那么,如果能對(duì)泛型TDocument進(jìn)行約束,使得泛型類型必須實(shí)現(xiàn)接口IDocument,則不會(huì)出現(xiàn)對(duì)類型進(jìn)行強(qiáng)制轉(zhuǎn)換時(shí)的異常。甚至不需要強(qiáng)制轉(zhuǎn)換,性能也將得到優(yōu)化。因此,前面的泛型文檔管理器改寫為(前面的T,改寫為TDocument,以此暗示是文檔類型):

public class DocumentManager<TDocument>
  where TDocument : IDocument
{
   //……   
}

  對(duì)于實(shí)現(xiàn)了約束的泛型文檔管理器,可以處理任何實(shí)現(xiàn)了IDocument接口的類。其DisplayAllDocuments()方法改寫為:

public void DisplayAllDocuments()
{
  foreach (TDocument doc in documentQueue)
  {
    Console.WriteLine(doc.Title);
  }
}

  在其他地方調(diào)用時(shí),可以用Document類型實(shí)例化泛型類型DocumentManager<TDocument>。因?yàn)镈ocument實(shí)現(xiàn)了接口IDocument:

static void Main()
{
  var dm = new DocumentManager<Document>();
  dm.AddDocument(new Document("Title A", "Sample A"));
  dm.AddDocument(new Document("Title B", "Sample B"));

  dm.DisplayAllDocuments();

  if (dm.IsDocumentAvailable)
  {
    Document d = dm.GetDocument();
    Console.WriteLine(d.Content);
  }
}

  泛型類型支持的幾種約束:struct(結(jié)構(gòu)約束,類型T必須是值類型)、class(類約束,類型T必須是引用類型)、IFoo(類型T必須實(shí)現(xiàn)接口IFoo)、new()(構(gòu)造函數(shù)約束,類型T必須有一個(gè)無參構(gòu)造函數(shù))、TOther(類型T派生自TOther,也稱“裸類型約束”)。

  泛型約束中:

  • 只能為無參構(gòu)造函數(shù)定義構(gòu)造約束,不能為有任何參數(shù)的構(gòu)造函數(shù)定義構(gòu)造函數(shù)約束。
  • 泛型可以有多個(gè)約束。如:public class DocumentManager<TDocument> where TDocument : IDocument,new()。
  • where不能定義必須由泛型類型實(shí)現(xiàn)的運(yùn)算符

3、繼承

  泛型類也可以實(shí)現(xiàn)繼承,如Queue<T>里,繼承實(shí)現(xiàn)了接口IEnumerable<T>接口。泛型類型可以實(shí)現(xiàn)泛型接口,也可以派生自一個(gè)類。泛型類型可以派生自泛型基類:

class Base<T>
{
  //...............
}

class Derived<T>:Base<T>
{
  //...............
}

  派生類可以是泛型類,也可以是非泛型類型:

abstract class Calc<T>
{
  public abstract T Add(T x, T y);
  public abstract T Sub(T x, T y);
}

class IncCalc: Calc<int>
{
  public override int Add(int x, int y)
  {
    return x + y;
  }
  public override int Sub(int x, int y)
  {
    return x - y;
  }
}
class DoubleCalc : Calc<double>
{
  public override double Add(double x, double y)
  {
    return x + y;
  }
  public override double Sub(double x, double y)
  {
    return x - y;
  }
}

4、靜態(tài)成員

  泛型類的靜態(tài)成員只能在一個(gè)實(shí)例中共享:

class StaticDemo<T>
{
  public static string Type;
}

static void Main()
{
  StaticDemo<int>.Type = "int類型";
  StaticDemo<object>.Type = "Object類型";
  Console.WriteLine(StaticDemo<int>.Type);//輸出:int類型
}

  實(shí)際上,每當(dāng)用一個(gè)類型去代替泛型中的T時(shí),都是在創(chuàng)造一個(gè)實(shí)例類型。因此,泛型類型中的靜態(tài)字段,會(huì)在不同的類型替代泛型T的實(shí)例中重新生成。這樣設(shè)計(jì)也有好處,可以為程序提供一個(gè)“泛型緩存”的概念,使用泛型的靜態(tài)成員,使它存放在緩存中,方便調(diào)用。

以上就是詳解c# 泛型類的功能的詳細(xì)內(nèi)容,更多關(guān)于c# 泛型類的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C# Socket文件上傳至服務(wù)器的操作方法

    C# Socket文件上傳至服務(wù)器的操作方法

    文件上傳有FTP、WebApi、WebService等等,這次我們來實(shí)現(xiàn)一個(gè)基于socket通信的本地客戶端上傳文件到服務(wù)器的例子,這篇文章主要介紹了C# Socket文件上傳至服務(wù)器的操作方法,需要的朋友可以參考下
    2024-05-05
  • C#圖片處理3種高級(jí)應(yīng)用

    C#圖片處理3種高級(jí)應(yīng)用

    本文介紹C#圖片處理高級(jí)應(yīng)用,這些功能并無多大技術(shù)含量。全部基于.Net Framework類庫完成,代碼中包含了C#圖片處理的一些基礎(chǔ)知識(shí),與大家分享,個(gè)人能力有限,不足之處還請(qǐng)及時(shí)指正。
    2015-10-10
  • 使用遞歸算法求第30位數(shù)的值

    使用遞歸算法求第30位數(shù)的值

    這篇文章主要介紹了使用遞歸求第30位數(shù)的值,需要的朋友可以參考下
    2014-02-02
  • 解決在Unity中使用FairyGUI遇到的坑

    解決在Unity中使用FairyGUI遇到的坑

    這篇文章主要介紹了解決在Unity中使用FairyGUI遇到的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • C#路徑,文件,目錄及IO常見操作匯總

    C#路徑,文件,目錄及IO常見操作匯總

    這篇文章主要介紹了C#路徑,文件,目錄及IO常見操作,較為詳細(xì)的分析并匯總了C#關(guān)于路徑,文件,目錄及IO常見操作,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-09-09
  • C#實(shí)現(xiàn)備忘錄功能

    C#實(shí)現(xiàn)備忘錄功能

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)備忘錄功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • C#調(diào)用百度地圖API根據(jù)地名獲取經(jīng)緯度geocoding

    C#調(diào)用百度地圖API根據(jù)地名獲取經(jīng)緯度geocoding

    本文主要介紹了C#調(diào)用百度地圖API根據(jù)地名獲取經(jīng)緯度geocoding,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Silverlight將圖片轉(zhuǎn)換為byte的實(shí)現(xiàn)代碼

    Silverlight將圖片轉(zhuǎn)換為byte的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Silverlight將圖片轉(zhuǎn)換為byte的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2015-11-11
  • C#入門之索引器使用實(shí)例

    C#入門之索引器使用實(shí)例

    這篇文章主要介紹了C#的索引器使用方法,對(duì)此,C#初學(xué)者應(yīng)予以牢固掌握,需要的朋友可以參考下
    2014-08-08
  • C#實(shí)現(xiàn)貪吃蛇小游戲

    C#實(shí)現(xiàn)貪吃蛇小游戲

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評(píng)論

江口县| 商都县| 永寿县| 兴隆县| 呼伦贝尔市| 同德县| 松桃| 循化| 禹州市| 商水县| 德昌县| 资兴市| 怀仁县| 中江县| 博兴县| 赫章县| 奇台县| 五华县| 封开县| 瑞丽市| 定兴县| 大洼县| 丽水市| 鸡东县| 如皋市| 梁山县| 建湖县| 五寨县| 商洛市| 禄丰县| 游戏| 普定县| 青川县| 北海市| 砀山县| 焉耆| 渝中区| 宜黄县| 泰安市| 奇台县| 明溪县|