C#中什麼是泛型 //作者:Microsoft.NET團隊 qianshangqs

轉自:http://zhidao.baidu.com/link?url=dldOy6scW_gzjhIQa3RDFwUoU3KgRpWjMrNR2izOwUG85Q4ZX77sdp9dAAI7J8eZtqdwOuUnsyrziJKaJrbfF_

所謂泛型是指將類型參數化以達到代碼複用提高軟件開發工作效率的一種數據類型。

一種類型佔位符,或稱之爲類型參數。我們知道一個方法中,一個變量的值可以作爲參數,但其實這個變量的類型本身也可以作爲參數。泛型允許我們在調用的時候再指定這個類型參數是什麼。在.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);
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章