日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.NET泛型解析(上)

發布時間:2025/6/17 asp.net 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET泛型解析(上) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【1】:泛型介紹

泛型是C#2.0中一個重要的新特性,泛型是CLR和編程語言提供的一種特殊機制,它支持另一種形式的代碼重用。泛型通常用與集合以及作用于集合的方法一起使用,當然也可以單獨使用.

C#是一種強類型的語言,在泛型沒有被提出之前,我們在使用集合的代碼的時候,每次對其進行轉換都需要隱式的強制轉換,我們都知道所有對象的最終基類是object,我們在每次使用object的時候,無論是變換什么類型都要對其進行強制轉換。 那么有了泛型之后,使用泛型我們就無需進行轉換,因為泛型根據接收者傳入的參數類型,直接將每個類型更改為所傳入的參數類型.

一般情況下,創建泛型類的過程為:從一個現有的具體類開始,逐一將每個類型更改為類型參數,直至達到通用化和可用性的最佳平衡。?創建您自己的泛型類時,需要特別注意以下事項:

  • 將哪些類型通用化為類型參數。

    通常,能夠參數化的類型越多,代碼就會變得越靈活,重用性就越好。?但是,太多的通用化會使其他開發人員難以閱讀或理解代碼。

  • 如果存在約束,應對類型參數應用什么約束

    一條有用的規則是,應用盡可能最多的約束,但仍使您能夠處理必須處理的類型。?例如,如果您知道您的泛型類僅用于引用類型,則應用類約束。?這可以防止您的類被意外地用于值類型,并允許您對?T?使用?as?運算符以及檢查空值。

  • 是否將泛型行為分解為基類和子類。

    由于泛型類可以作為基類使用,此處適用的設計注意事項與非泛型類相同。?請參見本主題后面有關從泛型基類繼承的規則。

  • 是否實現一個或多個泛型接口。

    例如,如果您設計一個類,該類將用于創建基于泛型的集合中的項,則可能必須實現一個接口,如?IComparable,其中?T?是您的類的類型。

【2】:泛型的表示方式

泛型可以為引用類型和值類型還有接口和委托,FCL( DLL程序集,包含了.NET框架下的各種DLL )類中定義了一個泛型列表,用來管理一個對象集合,如果我們想要使用這個泛型列表,可以在使用時指定具體數據類型。 泛型的表示為 “T” 如:List<T>, T 表示一個未指定的數據類型,我們可以看一下FCL類中泛型的引用定義: System.Collections.Generic?命名空間包含定義泛型集合的接口和類,泛型集合允許用戶創建強類型集合,它能提供比非泛型強類型集合更好的類型安全性和性能。 創建泛型類的過程為:從一個現有的具體類開始,逐一將每個類型更改為類型參數,直至達到通用化和可用性的最佳平衡

【3】:泛型的好處

1 : 使代碼更加的簡潔,清晰 ?從前面我們也提到了,泛型具備可重用性 , 減少我們代碼量, 使我們的程序更容易開發和維護,舉例 : ?實例 1 : 在從數據庫中獲取數據庫的時候,我們經常會返回一個DataTable類型,然后將其轉換為List集合. 那么如果沒有泛型的話,我會一般會這樣來做. 1 public List<TrainingUser>GetTrainingUser(string userId) 2 { 3 DataTable dt = 4 SqliteHelper.ExecuteDataset(System.Data.CommandType.Text, 5 @" 6 SELECT DISTINCT UserId,TrainingId FROM TRAININGUSER AS TU 7 INNER JOIN [USER] AS U 8 ON U.ID = TU.USERID 9 JOIN [TRAINING] AS T 10 ON T.ID = TU.TRAININGID 11 WHERE U.ID = '"+userId+"' AND T.ENDTIME > DATETIME('now', 'localtime') AND T.StartTime <= DATETIME('now', 'localtime') ;").Tables[0]; 12 return DataTableToList(dt); 13 } 14 15 private List<TrainingUser> DataTableToList(DataTabledt) 16 { 17 List<TrainingUser> list = new List<TrainingUser>(); 18 if(dt. Rows.Count > 0 ) 19 { 20 foreach (DataRow row in dt .Rows) 21 { 22 TrainingUser trainingUser = new TrainingUser(); 23 if(row["UserId" ] != null) 24 { 25 trainingUser .UserId = row["UserId"].ToString(); 26 } 27 if(row["TrainingId" ] != null) 28 { 29 trainingUser.TrainingId = row["TrainingId"].ToString(); 30 } 31 list.Add(trainingUser); 32 } 33 } 34 return list; 35 } View Code 在方法DataTableToList中,我們傳入了一個DataTable的對象,然后在去循環遍歷每一行的對象值從而去賦值給TrainingUser類型對象,這只是其中的一個方法,如果我們的類型還有 Training/User/Project等類型的話,我們是不是就要寫很多如同DataTableToList這樣的方法呢? 這就體現出了這樣的方式,會造成代碼的冗余以及維護不便問題,那么我們使用泛型來解決 實例 2 : 使用泛型使上面的代碼更見的清晰,簡潔 1 public static List<T> ToList1<T>(DataTable dt) whereT : class, new() 2 { 3 var prlist =new List<PropertyInfo>(); 4 Type type = typeof(T); 5 Array.ForEach( 6 type.GetProperties(), 7 p => 8 { 9 if(dt.Columns.IndexOf(p.Name) !=-1) 10 { 11 prlist.Add(p); 12 } 13 }); 14 var oblist = new List<T>(); 15 16 // System.Data.SqlTypes. 17 foreach(DataRow row in dt.Rows) 18 { 19 var ob = new T(); 20 prlist.ForEach( 21 p => 22 { 23 if(row[p.Name] != DBNull.Value) 24 { 25 p.SetValue(ob, row[p.Name], null); 26 } 27 }); 28 oblist.Add(ob); 29 } 30 31 return oblist; 32 } View Code

在上面的這個方法中,我們定義了一個泛型方法,內部實現中是使用了反射的原理,將DataTable轉換為了List(反射后續隨筆中總結,此處只關注泛型部分即可),我們定義了一個靜態的返回值為List<T> ,前面我們說過 T : 代表任意類型(枚舉除外),ToList1<T>,說明我們在調用這個方法的時候,同時要賦予方法名一個類型值,這個類型要和它的返回值類型一致(泛型是類型安全的),Where : 用于限制T的條件 ,例如 where T : class,new() 表示 T 只能是一個類,或者一個類型對象,那么我們在調用的時候就可以這樣來?

1 public List<TrainingUser>GetTrainingIdByUserId(string userId) 2 { 3 List<TrainingUser> trainingUserList = DataTableHelper.ToList1<TrainingUser>( 4 SqliteHelper.ExecuteDataset(System.Data.CommandType.Text, 5 @" 6 SELECT DISTINCT UserId,TrainingId FROM TRAININGUSER AS TU 7 INNER JOIN [USER] AS U 8 ON U.ID = TU.USERID 9 JOIN [TRAINING] AS T 10 ON T.ID = TU.TRAININGID 11 WHERE U.ID = '"+ userId +"' AND T.ENDTIME > DATETIME('now', 'localtime') AND T.StartTime <= DATETIME('now', 'localtime') ;").Tables[0]); 12 return trainingUserList ; 13 } View Code 代碼中的DataTableHelper.ToList1<TrainingUser> 即為我們剛才所寫的一個泛型方法,這樣我們可以看到,ToList<T> 傳入的類型為TrainingUser,同時接收者為:List<T> = List<TrainingUser> ,? 這樣即便我們后續還有Training/User/Project等其他的類型,我們都可以直接使用DataTableHelper.ToList1<T>(DataTable dt) 來進行類型轉換. 2 : 提升程序的性能 泛型與非泛型相比較而言,性能要好一些,這是為什么? 首先,泛型的類型是由調用者(接收者),去直接賦值的(類型安全的), 那么就不會存在類型轉換的問題,其次, 泛型減少了裝箱和拆箱的過程. 實例 3 : 對于值類型泛型與非泛型的性能比較 1 private static void ListTest() 2 { 3 List<int>list = new List<int>(); 4 for(inti = 0; i < 100; i++) 5 { 6 list.Add(i); 7 int a = list[i]; 8 } 9 list =null; 10 } 11 private static void ArrListTest() 12 { 13 ArrayList arr = new ArrayList(); 14 for(inti = 0; i <100; i++) 15 { 16 arr.Add(i); 17 int s = (int)arr[i]; 18 } 19 arr = null; 20 } 21 22 Stopwatch sw = new Stopwatch(); 23 sw.Start(); 24 ListTest(); 25 Console.WriteLine(" 使用泛型List執行值類型方法歷時 : "+ sw.Elapsed.ToString()); 26 sw.Stop(); 27 28 Stopwatch sw1 = new Stopwatch(); 29 sw1.Start(); 30 ArrListTest(); 31 Console.WriteLine(" 使用非泛型ArrayList執行值類型方法歷時 : "+ sw1.Elapsed.ToString()); 32 sw1.Stop(); 33 Console.ReadLine(); View Code

通過循環 100 來比較,結果為 :?

我們可以看到非泛型的時間要比泛型的時間多出0.0000523秒,泛型比非泛型的時間要多出一些, 那么我們將數值改動一下改為循環 1000次.得出結果為 :?

泛型比非泛型執行的時間要短0.0000405秒 我們將時間在改動一下,改為 100000呢?結果為 :? 這次差距為 0.0054621 并且隨著執行次數的增長,非泛型相比泛型的時間會逐步的增加, 通過反編譯我們也能看出 :? 泛型: 非泛型 從編譯中我們也能看出泛型方法中,接收的為Int32,非泛型為Object,其次泛型不會進行裝箱和拆箱操作,非泛型每次執行都要進行裝箱和拆箱操作. 3 : 類型安全 在實例1 , 2 ,3 中我們都有備注說明,泛型的發送著必須要和接收者進行一致,否則會報異常 ,例如 : 實例 4 : 將一個泛型算法應用于一個具體的類型時,編譯器和CLR能理解開發人員的意圖,并保證只有與指定數據類型兼容的對象才能隨同算法使用,若試圖使用不兼容類型的一個對象,會造成編譯時錯誤,或者運行時拋出異常

? 此篇至此,下篇主要知識點 :

1、泛型方法 2、泛型接口 3、泛型約束(主要約束,次要約束,構造器約束) 4、泛型類型轉型 5、泛型委托 6、泛型和反射 7、泛型和屬性 參考資料 : CLR C# Via 深入理解C# https://msdn.microsoft.com/zh-cn/library/sz6zd40f.aspx https://msdn.microsoft.com/zh-cn/library/0x6a29h6.aspx

? ? ? ?溫馨提示 : ?知識點重溫,不斷總結,思考, 也是一種階段性提高,希望能幫到在讀的你.

轉載于:https://www.cnblogs.com/DeepLearing/p/4554867.html

總結

以上是生活随笔為你收集整理的.NET泛型解析(上)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 夜色成人| 色哥网| 国产精品一区二区性色av | a色视频| 中国字幕一色哟哟 | 毛片高清免费 | 激情午夜视频 | 黄色网页在线免费观看 | 亚洲精品久久久久久久蜜桃臀 | 亚洲欧美www | 亚洲天堂av中文字幕 | 日本a级片网站 | 免费爱爱网站 | 国产亚洲精品精品精品 | av片在线免费看 | 国产精品av免费观看 | 在线二区 | 国产精品香蕉在线观看 | 久久伊人精品视频 | 老师张开让我了一夜av | 神秘马戏团在线观看免费高清中文 | 激情综合影院 | 国产精品一区二区三区免费 | 韩国无码一区二区三区精品 | 少妇av在线播放 | 精品国产18久久久久久二百 | 日韩欧美网站 | 蜜臀aⅴ免费一区二区 | japanese在线| 精品少妇一区二区三区在线观看 | 成人性生交大片免费看中文 | 青青草污视频 | 国产精品无码一区 | 一级特黄录像免费看 | 三级黄色片免费 | 很黄的网站在线观看 | 国产一区二区在线免费 | 国产欧美综合视频 | 日韩一区二区三区精品 | 在线免费日韩 | 免费看欧美一级片 | 懂色av懂色av粉嫩av分享吧 | 国产精欧美一区二区三区蓝颜男同 | 欧美三级 欧美一级 | 免费视频一区 | 少妇无码吹潮 | 蜜桃视频久久一区免费观看入口 | 成人午夜精品无码区 | 日韩经典午夜福利发布 | 四虎永久在线精品免费一区二区 | 啪啪国产精品 | 成av人在线观看 | 黄片毛片 | av在线短片| 亚洲天堂网站在线 | 一级黄色欧美 | 伊伊成人 | 双性高h1v1 | 免费看黄网址 | 国产美女裸体无遮挡免费视频 | 久久亚洲精选 | 欧美一区二区视频在线 | 日韩三级电影网址 | 亚洲你懂得 | 91亚洲精品一区 | 久热精品免费视频 | 午夜污| 91婷婷在线| 亚洲熟女综合一区二区三区 | 亚洲涩综合 | 精品视频免费在线 | av资源免费看 | 久久精品国产亚洲AV高清综合 | 禁网站在线观看免费视频 | 亚洲精品久久久中文字幕痴女 | 久久y| 曰本丰满熟妇xxxx性 | 蜜臀视频一区二区 | 理论片一级 | 欧美成人手机视频 | 成人自拍视频在线 | 日本美女一级片 | 91片黄在线观看 | 免费在线观看黄色片 | 综合色在线视频 | 一区二区三区日本视频 | 国产成人精品一区二区三区 | 欧美日韩亚洲二区 | 久久尹人 | 欧美视频久久久 | 久久亚洲一区二区三区四区五区 | 聚色av | 国产一区二区三区黄片 | 日韩精品免费一区二区夜夜嗨 | 在线观看免费黄色 | 成人在线免费电影 | 欧美三区视频 | 欧美精品v国产精品v日韩精品 | 久久这里只有精品6 |