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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...