c#泛型、默认值以及约束

原创 Laughing  2017-09-17 15:16  阅读 61 次 评论 0 条

古人云:温故而知新。

很久没有复习过c#的基础知识了,最近抽时间温习一下《C#高级编程》。

泛型

相信大家对于泛型应该都不会感到陌生,这里我们简单的通过一个泛型类引出下面的概念

  1. using System;  
  2. using System.Collections;  
  3. using System.Collections.Generic;  
  4.   
  5. namespace me.lisen.Practice  
  6. {  
  7.     public class DocumentManager<T>  
  8.     {  
  9.         private readonly Queue<T> documentQueue = new Queue<T>();  
  10.   
  11.         //添加文件  
  12.         public void AddDocument(T doc){  
  13.             lock(this){  
  14.                 documentQueue.Enqueue(doc);  
  15.             }  
  16.         }  
  17.   
  18.         //返回是否可用  
  19.         public bool IsDocumentAvaiable{  
  20.             get{  
  21.                 return documentQueue.Count > 0;  
  22.             }  
  23.         }  
  24.   
  25.         //获取文件  
  26.         public T GetDocument(){  
  27.             T doc = default(T);  
  28.             lock(this){  
  29.                 doc = documentQueue.Dequeue();  
  30.             }  
  31.             return doc;  
  32.         }  
  33.   
  34.         //展示所有文档  
  35.         public void DisplayAllDocuments(){  
  36.             foreach(IDocument doc in documentQueue){  
  37.                 Console.WriteLine(doc.Title);  
  38.             }  
  39.         }  
  40.     }  
  41. }  

默认值

其实上面的代码,我们已经展示了默认值,默认值通过default关键字获取。通过default关键字,将值类型赋值0,引用类型赋值null

约束

如果我们需要调用泛型中的方法,那么久需要添加约束,,防止类型转换出现异常。

  1. //展示所有文档  
  2.         public void DisplayAllDocuments(){  
  3.             foreach(IDocument doc in documentQueue){  
  4.                 Console.WriteLine(doc.Title);  
  5.             }  
  6.         }  

如果上面的代码,不定义泛型的约束,doc转换成IDocument时,就会导致转换异常。

Demo

IDocument.cs

  1. using System;  
  2. namespace me.lisen.Practice  
  3. {  
  4.     public interface IDocument{  
  5.         string Title { getset; }  
  6.         string Content { getset; }  
  7.     }  
  8. }  

Document.cs

  1. using System;  
  2. namespace me.lisen.Practice  
  3. {  
  4.     public class Document : IDocument  
  5.     {  
  6.         public Document(){}  
  7.         public Document(string title,string content){  
  8.             Title = title;  
  9.             Content = content;  
  10.         }  
  11.         public string Title { get ; set ; }  
  12.         public string Content { get ; set; }  
  13.     }  
  14. }  

DocumentManager.cs

  1. using System;  
  2. using System.Collections;  
  3. using System.Collections.Generic;  
  4.   
  5. namespace me.lisen.Practice  
  6. {  
  7.     public class DocumentManager<T> where T:IDocument,new()  
  8.     {  
  9.         private readonly Queue<T> documentQueue = new Queue<T>();  
  10.   
  11.         //添加文件  
  12.         public void AddDocument(T doc){  
  13.             lock(this){  
  14.                 documentQueue.Enqueue(doc);  
  15.             }  
  16.         }  
  17.   
  18.         //返回是否可用  
  19.         public bool IsDocumentAvaiable{  
  20.             get{  
  21.                 return documentQueue.Count > 0;  
  22.             }  
  23.         }  
  24.   
  25.         //获取文件  
  26.         public T GetDocument(){  
  27.             T doc = default(T);  
  28.             lock(this){  
  29.                 doc = documentQueue.Dequeue();  
  30.             }  
  31.             return doc;  
  32.         }  
  33.   
  34.         //展示所有文档  
  35.         public void DisplayAllDocuments(){  
  36.             foreach(IDocument doc in documentQueue){  
  37.                 Console.WriteLine(doc.Title);  
  38.             }  
  39.         }  
  40.     }  
  41. }  

Program.cs

  1. using System;  
  2. using System.Reflection;  
  3.   
  4. namespace me.lisen.Practice  
  5. {  
  6.     class MainClass  
  7.     {  
  8.         public static void Main(string[] args)  
  9.         {  
  10.             var dm = new DocumentManager<Document>();  
  11.             dm.AddDocument(new Document(title:"title a",content:"content a"));  
  12.             dm.AddDocument(new Document(title: "title b", content: "content b"));  
  13.             dm.DisplayAllDocuments();  
  14.             if(dm.IsDocumentAvaiable){  
  15.                 Document d = dm.GetDocument();  
  16.                 Console.WriteLine(d.Content);  
  17.             }  
  18.             Console.Read();  
  19.         }  
  20.     }  
  21. }  

历史上的今天:

本文地址:https://www.lisen.me/csharp-generic-default-value-limit.html
版权声明:本文为原创文章,版权归 木子网 所有,欢迎分享本文,转载请保留出处!

发表评论


表情