using System.Collections.Generic;

来源:http://www.cnblogs.com/anwser-jungle/archive/2016/09/24/5904198.html
-Advertisement-
Play Games

類型參數使得設計類和方法時,不必確定一個或多個具體參數,其的具體參數可延遲到客戶代碼中聲明、實現。 這意味著使用泛型的類型參數T,寫一個類MyList<T>,客戶代碼可以這樣調用:MyList<int>, MyList<string>或 MyList<MyClass>。 這避免了運行時類型轉換或裝箱 ...


  類型參數使得設計類和方法時,不必確定一個或多個具體參數,其的具體參數可延遲到客戶代碼中聲明、實現。

  這意味著使用泛型的類型參數T,寫一個類MyList<T>,客戶代碼可以這樣調用:MyList<int>, MyList<string>或 MyList<MyClass>。

  這避免了運行時類型轉換或裝箱操作的代價和風險。

下麵是普通的方法調用:

 1         public static void ShowInt(int iValue)
 2         {
 5             Console.WriteLine(" ShowInt方法 展示{0},其類型為{1}", iValue, typeof(int));//,iValue.GetType()); 6         }
 7 
 8         public static void ShowLong(long lValue)
 9         {
10             Console.WriteLine(" ShowLong方法 展示{0},其類型為{1}", lValue, lValue.GetType());
11         }
12 
13         public static void ShowString(string sValue)
14         {
15             Console.WriteLine(" ShowString方法 展示{0},其類型為{1}", sValue, sValue.GetType());
16         }
17 
18         public static void ShowDateTime(DateTime dValue)
19         {
20             Console.WriteLine(" ShowDateTime方法 展示{0},其類型為{1}", dValue, dValue.GetType());
21         }

這樣,每次都需要根據不同的類別調用不同的方法,這是很不方便的。

     /// <summary>
        /// 1 通過繼承,子類擁有父類的一切屬性和行為,任何父類出現的地方,子類都可以代替
        /// 2 object 類型是一切類型的父類
        /// </summary>
        /// <param name="oValue"></param>
        public static void ShowObject(object oValue)
        {
            Console.WriteLine(" ShowObject方法 展示{0},其類型為{1}", oValue, oValue.GetType());
        }

這樣,通過萬類之母object,不論什麼類型都可以調用,只需要一個方法,達到了代碼的重用。

但是,需要裝箱和拆箱操作,有效率上的損失,所以請看下麵的方法:

1         public static void Show<T>(T tValue)
2         {
3             Console.WriteLine(" Show<T>方法 展示{0},其類型為{1}", tValue, tValue.GetType());4         }

通過泛型的延遲申明,可以將兩者的不足之處相互結合,達到代碼的重用。

所謂延遲申明,就是先不什麼類型,用一個占位符代替,當要使用的時候再指定所需要的類型。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------泛型約束:

class代表引用類型,struct代表值類型。

1         public static T Show<T>(T tValue)
2         //where T : class  //引用類型
3         //where T : struct  //值類型
4         {
5             Console.WriteLine(" Show<T>方法 展示{0},其類型為{1}", tValue, tValue.GetType());//,iValue.GetType());//
6             return default(T);//根據泛型類型,提供預設值
7         }
 1     public class BaseModel
 2     {
 3         public int Id { get; set; }
 4         public string TableName { get; set; }
 5     }
 6 
 7     public class People : BaseModel
 8     {
 9         public People()
10         { }
11         public string Name { get; set; }
12         public int Age { get; set; }
13         public string Sex { get; set; }
14         /// <summary>
15         /// 打招呼
16         /// </summary>
17         public string Hi { get; set; }
18     }
19 
20     public interface ISports
21     {
22         void KickShuttlecock();
23     }
24 
25     public interface IWork
26     {
27         void DoJob();
28     }
29 
30     public class Chinese : People, ISports, IWork
31     {
32         public string Majiang { get; set; }
33         /// <summary>
34         /// 構造函數
35         /// </summary>
36         /// <param name="name"></param>
37         public Chinese(string name)
38         {
39             base.Hi = "早上好,吃了嗎";
40             base.TableName = "P_Chinese";
41         }
42         public Chinese()
43         {
44             base.Hi = "早上好,吃了嗎";
45             base.TableName = "P_Chinese";
46         }
47 
48 
49         public void KickShuttlecock()
50         {
51             Console.WriteLine("踢毽子");
52         }
53 
54         public void DoJob()
55         {
56             Console.WriteLine("養家糊口");
57         }
58     }
View Code
 1         public static T Hi<T>(T t) where T : People, ISports, IWork, new()
 2         {
 3             T tModel = new T();//new()約束表明T擁有一個無參數的構造函數
 4             tModel.Id = 11;//People約束決定
 5             tModel.Name = "花心胡蘿蔔";//people約束決定
 6             tModel.Sex = "";//people約束決定
 7 
 8             tModel.KickShuttlecock();//ISports介面約束決定
 9             tModel.DoJob();//IWork介面約束決定
10             return tModel;
11         }

通過上面看出來,約束就是一種限定。只有符合約束類型的參數才能代替給定的類型參數。

比如下麵的調用:

1             Chinese chinese = new Chinese()
2             {
3                 Id = 123,
4                 Name = "天忝♂開心"
5             };
6             GenericConstraint.Hi<Chinese>(chinese);

 

 

 

 

 

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、POST加電自檢 按下電源後ROM晶元中的CMOS程式執行並檢測CPU、記憶體等設備是否存在並正常運行,CMOS中的程式叫BIOS,可以設置硬碟介面,網卡音效卡開關之類的簡單設置。一般PC機主板上有一個紐扣電池,這個電池就是給ROM供電的,可以保證主板斷電後BIOS的一些基本設置不會重置。 下麵是一 ...
  • 我們知道,迄今為止,Ubuntu已有多個發行版,如11.04、11.10,以至於現在最新的16. 。而我們平常通過apt get來安裝軟體,如果OS版本不同,那麼鏡像源的配置就不同,否則就會出現找不到對應軟體、軟體版本不匹配等一系列奇怪的問題。這裡,我就講述一下如何配置不同的版本的鏡像源。在此,我就 ...
  • 1.編譯器gcc的語法順序 PC: gcc -o ana *.o ${LIBS} 輸出可執行文件名 各種目標文件 要鏈接的庫 交叉編譯:arm-linux-gcc ${LIBS] *.o -o ana 2.Minigui.config 將/usr/local/etc/MiniGUI.cfg 與 ./ ...
  • 關於《rsyslog+mysql+loganalyzer搭建日誌伺服器<個人筆記>》的反思--鏈接--http://www.cnblogs.com/drgcaosheng/p/5832697.html 之前使用這個搭建了一個日誌伺服器,但是在mysql中,日誌增加太快,過了些天,已經有幾千萬的數據了 ...
  • 0 Asp.Net Core 項目實戰之許可權管理系統(0) 無中生有 1 Asp.Net Core 項目實戰之許可權管理系統(1) 使用AdminLTE搭建前端 2 Asp.Net Core 項目實戰之許可權管理系統(2) 功能及實體設計 3 Asp.Net Core 項目實戰之許可權管理系統(3) 通過 ...
  • Linq to JSON是用來操作JSON對象的.可以用於快速查詢,修改和創建JSON對象.當JSON對象內容比較複雜,而我們僅僅需要其中的一小部分數據時,可以考慮使用Linq to JSON來讀取和修改部分的數據而非反序列化全部. 二.創建JSON數組和對象 在進行Linq to JSON之前,首 ...
  • 一、內置對象 (一)Response對象 1、簡介:response 對象在ASP中負責將信息傳遞給用戶.Response對象用於動態響應客戶端請求,並將動態生成的響應結果返回到客戶端瀏覽器中,使用Response對象可以直接發送信息給瀏覽器,重定向瀏覽器到另一個URL或設置cookie的值等. 2 ...
  • 很久沒在博客園寫文章了,打算把一直由自己一個人寫的一整套系統開放出來,今天先放一些截圖及可以演示的地址! 這套系統包含數據層(HB.Data)、計劃任務(HB.PlanTask)、日誌系統(HB.Log)、模版系統(HB.TemplateEngine)、Url重寫(HB.UrlRewriter)、a ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...