C#中什么是泛型

所謂泛型是指將類型參數化以達到代碼復用提高軟件開發工作效率的一種數據類型。
一種類型占位符,或稱之為類型參數。我們知道一個方法中,一個變量的值可以作為參數,但其實這個變量的類型本身也可以作為參數。泛型允許我們在調用的時候再指定這個類型參數是什么。在.net中,泛型能夠給我們帶來的兩個明顯好處是——類型安全和減少裝箱、拆箱。
  例如:通常一個方法或過程的簽名都是有明確的數據類型的。
  如 :
  public void ProcessData(int i){}
  public void ProcessData(string i){}
  public void ProcessData(decimal i){}
  public void ProcessData(double i){}
  等。
  這些方法的簽名中的:int ,string,decimal,double 都是明確的數據類型,程序員訪問這些方法的過程中需要提供提定類型的參數:
  ProcessData(123);
  ProcessData("abc");
  ProcessData("12.12")
  而如果我們將int ,string,decimal,double這些類型也當成一種參數傳給方法的時候方法的定義便是這樣:
  public void ProcessData<T>(T i){} //T是int ,string,decimal,double這些數據類型的指代
  用戶在調用的時候便成了這樣:
  ProcessData<string>("abc");
  ProcessData<int>(123);
  ProcessData<double>(12.23);
  這與通常的那些定義的最大區別是,方法的定義實現過程只有一個。但是它具有處理不同的數據類型數據的能力。
  C# 2.0中有如List<>等泛型對象都具有此特性。
  具有泛型機制的軟件開發平臺及語言
  .Net 平臺 2.0及以上版本
  JAVA 5及以上版本
  泛型的好處:
  泛型是c#2.0的一個新增加的特性,它為使用c#語言編寫面向對象程序增加了極大的效力和靈活性。它允許程序員將一個實際的數據類型的規約延遲至泛型的實例被創建時才確定。泛型為開發者提供了一種高性能的編程方式,能夠提高代碼的重用性,并允許開發者編寫非常優雅的解決方案。

數據層:
public List<libs.Model.Artitle> GetAllArt()
{
List<libs.Model.Artitle> list = new List<Artitle>();

string sqlconn = System.Configuration.ConfigurationSettings.AppSettings["sqlconn"];
SqlConnection conn = new SqlConnection(sqlconn);
string sqlstr = "select titleid,Title,author,company,Uploaddate,isVidate,conimages,content from writings order by titleid asc";
SqlCommand cmd = new SqlCommand (sqlstr,conn);

try
{
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
libs.Model.Artitle artles = new Artitle();
artles.Titleid = int.Parse(reader["titleid"].ToString());
artles.Title = reader["title"].ToString();
artles.Uploaddate = DateTime.Parse(reader["Uploaddate"].ToString());
list.Add(artles);
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
conn.Close();
}
return list;
}
邏輯層:
public List<Artitle> GettitleAll()
{
return new libs.DAL.ArtileAccess().GetAllArt();
}
web層調用:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
this.GetallArt();

}
}
public void GetallArt()
{
libs.Log.Artitless atrlesst = new libs.Log.Artitless();
this.Repeater1.DataSource = atrlesst.GettitleAll(); //或者直接調用數據庫層:
//this.Repeater1.DataSource = new libs.DAL.ArtileAccess().GetAllArt();
this.Repeater1.DataBind();
}

泛型較為廣泛地被討論,這里寫到的只是作為新手的入門級認識。
泛型最常應用于集合類。
泛型的一個顯而易見的優點在于可以在許多操作中避免強制轉換或裝箱操作的成本或風險,拿ArrayList這個集合類來說,為了達到其通用性,集合元素都將向上轉換為object類型,對于值類型,更是有裝箱拆箱的成本:
static void Main(string[] args)
{
ArrayList al = new ArrayList();
al.Add(1);
}
在IL中是:
IL_0008: ldc.i4.1
IL_0009: box [mscorlib]System.Int32
IL_000e: callvirt instance int32 [mscorlib]System.Collections.ArrayList::Add(object)
box操作就是裝箱,具體過程是把值類型從棧中彈出,放入堆中,同時把在堆中的地址壓入到棧中,頻繁出現這樣的操作,成本比較大。

所以在2.0中,遇到以上的應用,應該使用泛型集合類List<T>:
static void Main(string[] args)
{
List<int> l = new List<int>();
l.Add(1);
}

另一個比較常用的泛型集合類是Dictionary<T,T>,用于保存鍵值對:
static void Main(string[] args)
{
Dictionary<int, string> dict = new Dictionary<int, string>();
dict.Add(1, "SomeBook1");
dict.Add(2, "SomeBook2");
dict.Add(3, "SomeBook3");

Console.WriteLine(dict[2]);//output:SomeBook2
dict[2] = "SomeCD1";//modify
Console.WriteLine(dict[2]);//output:SomeCD1

dict.Remove(2);//delete

foreach (KeyValuePair<int, string> kv in dict)
{
Console.WriteLine("Key = {0}, Value = {1}",kv.Key, kv.Value);
}
}

轉載于:https://www.cnblogs.com/Nine4Cool/p/4249159.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376301.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376301.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376301.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

敏捷自動化測試(1)—— 我們的測試為什么不夠敏捷?

測試是為了保證軟件的質量&#xff0c;敏捷測試關鍵是保證可以持續、及時的對軟件質量情況進行全面的反饋。由于在敏捷開發過程中每個迭代都會增加功能、修復缺陷或重構代碼&#xff0c;所以在完成當前迭代新增特性測試工作的同時&#xff0c;還要通過回歸測試來保證歷史功能不…

學習c++

目錄 一 、 boost庫&#xff1a; 1. 多線程 c boost多線程學習&#xff08;一&#xff09; 二 、數據庫&#xff1a; 三、socket編程&#xff1a; c socket學習&#xff08;1.1&#xff09; c socket學習&#xff08;1.2&#xff09; c socket學習&#xff08;1.3&#x…

mysql5.6與mysql5.5不同

1.編譯階段 要明白with與without的區別&#xff0c;選項值分1和0&#xff0c;或者對應為on或off&#xff0c;代表支持與不支持&#xff1b;with的1&#xff08;on&#xff09;與without的0&#xff08;off&#xff09;是同樣的&#xff0c;with的0&#xff08;off&#xff09;與…

c++ 基本排序算法學習

C實現排序算法 代碼地址 vector<unsigned int> cVec; int nSize cVec.size();1 冒泡排序 算法思路&#xff1a; 每兩兩相鄰的數值都會比較大小&#xff0c;前面比后面大的時候就交換位置&#xff0c;否則就不動。 代碼&#xff1a; void BubbleSort() {//優化&#x…

ios 程序學習

馬上著手開發iOS應用程序&#xff1a;五、提交應用與尋找信息 2013-01-11 15:36 佚名 apple.com 我要評論(0) 字號&#xff1a;T | T本文介紹了您已經學習完如何開發一個優秀的iOS應用之后&#xff0c;應該掌握的內容&#xff0c;包括將您的應用提交到App Store讓其他人下載&am…

解決SimpleButton被移除后保持OVER狀態

假設場景中有一SimpleButton叫testBtn,執行下面操作&#xff1a;1.鼠標移上testBtn&#xff0c; testBtn狀態變為OVER2.移除testBtn&#xff0c;removeChild(testBtn)3.5秒后重新添加testBtn到場景此時&#xff0c;看見testBtn還是OVER狀態。解決方法&#xff1a;1.記錄testBtn…

c++ socket學習(1.1)

本文學習相關資料&#xff1a; C/C socket編程教程 環境&#xff1a;vs2015 源碼&#xff1a;本文代碼 windows 如何創建客戶端與服務端通信&#xff1f; TCP&#xff1a; 服務端 在windows先告訴程序我們要使用哪個版本的winsock&#xff0c;成功調用了它才能繼續下去 #…

c++ socket學習(1.2)

本文學習相關資料&#xff1a; C/C socket編程教程 環境&#xff1a;vs2015 源碼&#xff1a;本文代碼 windows 如何創建客戶端與服務端通信&#xff1f; UDP&#xff1a; 這次就沒什么客戶端服務端好說了&#xff0c;UDP是沒有無連接的 所以改叫接收端和發送端吧 接收端 …

js高級功能與高級需求、高級期待

http://www.cnblogs.com/leadzen/archive/2008/02/25/1073404.html 簡單練習題&#xff1a;http://tieba.baidu.com/p/2189347922 ---------------------- scope鏈 閉包 Javascript屬性prototype node.js metaprogramming AMD、CMD機制 http://www.makumo.com/js-modules-amd-c…

synchronized同步鎖

在多線程的情況下&#xff0c;由于同一進程的多個線程共享同一片存儲空間&#xff0c;在帶來方便的同時&#xff0c;也帶來了訪問沖突這個嚴重的問題。Java語言提供了專門機制以解決這種沖突&#xff0c;有效避免了同一個數據對象被多個線程同時訪問。由于我們可以通過 private…

c++ socket學習(1.3)

本文學習相關資料&#xff1a; C/C socket編程教程 環境&#xff1a;vs2015 源碼&#xff1a;本文代碼 在這里c socket學習&#xff08;1.1&#xff09;學到了怎么樣建立TCP&#xff0c;然后通過TCP連接發送、接收信息。 但是都是一次性的&#xff0c;當時是接收信息后就結束…

一個一線城市的IT白領的生活成本:3萬/年

自從大學畢業&#xff0c;經濟獨立&#xff0c;就開始全面統計各種生活開支。仔細的去統計下&#xff0c;發現開銷還是挺大的。 定理&#xff1a;開銷越大&#xff0c;就意味著你每個月的收入必須越高。 三族鼎立節余族: 收入-開支 > 0月光族&#xff1a;收入-開支 0透支族…

android 編譯共享ccache的緩存

1. android自帶的ccache版本號(2.4版本號)過低&#xff0c;是無法支持以上的功能的&#xff0c;須要使用新版ccache。2. 最新的ccache請到http://ccache.samba.org/download.html下載3. 下載解壓之后&#xff0c;在linux底下進入ccache文件夾&#xff0c;執行:./configure./mak…

一位軟件工程師的6年總結

作者&#xff1a;成曉旭 “又是一年畢業時”&#xff0c;看到一批批學子離開人生的象牙塔&#xff0c;走上各自的工作崗位&#xff1b;想想自己也曾經意氣風發、躊躇滿志&#xff0c;不覺感嘆萬千……本文是自己工作6年的經 歷沉淀或者經驗提煉&#xff0c;希望對所有的軟件工…

c++ socket學習(1.4)

本文學習相關資料&#xff1a; C/C socket編程教程 環境&#xff1a;vs2015 源碼&#xff1a;本文代碼 前面學到了TCP怎么循環發包&#xff0c;但是TCP連接的話會出現一個問題粘包。 TCP連接接收到的數據并不是馬上讀取到內存里面的&#xff0c;而是放在緩沖區&#xff0c;讓…

mongodb中分頁顯示數據集的學習

mongodb中分頁顯示數據集的學習 這次繼續看mongodb中的分頁。首先依然是插入數據&#xff1a; 1&#xff09; db.Blog.insert( { name : "Denis", age : 20, city : "Princeton" } ) db.Blog.insert( { name : "Abe", age : 30, city : &quo…

學習編程,英語很重要!!

學會編程&#xff0c;可能不需要英語多好&#xff0c;但是學號編程&#xff0c;英語真的很重要&#xff01;&#xff01;&#xff01; 好多文檔&#xff0c;demo全是英文的&#xff0c;蛋疼&#xff0c;應許需要學習&#xff01;&#xff01;&#xff01;轉載于:https://www.cn…

c++ socket學習(1.5)

本文學習相關資料&#xff1a; C/C socket編程教程 環境&#xff1a;vs2015 源碼&#xff1a;本文代碼 這次來試一下使用TCP來傳輸文件&#xff0c;其實傳輸數據和差不多&#xff0c;就是多一個讀取文件&#xff0c;和一個寫文件而已。 服務端 int readlan 100; std::ifst…

matlab生成HEX文件-任意信號 大于64K長度

HEX文件格式不贅述&#xff0c;寫里直接放上代碼。請批評改正。 1 %%convert a signal data into hex file format2 % data format:16bit 3 % signal length: less than 2^24-14 % author: Yang Li yangli0534gmail.com5 % data:2015.01.276 7 clear all;8 close all;9 clc; 10…

移動端網頁中ViewPort的使用

<meta name"viewport" content"widthdevice-width,target-densitydpihigh-dpi, initial-scale1.0, minimum-scale1.0, maximum-scale1.0, user-scalableno"> <meta name”viewport” content”widthdevice-width, initial-scale1.0, user-scalabl…