什么是泛型(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);

   }

}
转:http://blog.sina.com.cn/s/blog_4e6dffee0100bxty.html



本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/archive/2011/12/09/2281950.html,如需转载请自行联系原作者

目录
相关文章
|
4月前
|
存储 安全 编译器
C# 11.0中的泛型属性:类型安全的新篇章
【1月更文挑战第23天】C# 11.0引入了泛型属性的概念,这一新特性为开发者提供了更高级别的类型安全性和灵活性。本文将详细探讨C# 11.0中泛型属性的工作原理、使用场景以及它们对现有编程模式的改进。通过深入了解泛型属性,开发者将能够编写更加健壮、可维护的代码,并充分利用C#语言的最新发展。
|
12月前
|
存储 算法 安全
C#三十二 泛型的理解和使用
C#三十二 泛型的理解和使用
32 0
|
6天前
|
安全 程序员 编译器
C#一分钟浅谈:泛型编程基础
在现代软件开发中,泛型编程是一项关键技能,它使开发者能够编写类型安全且可重用的代码。C# 自 2.0 版本起支持泛型编程,本文将从基础概念入手,逐步深入探讨 C# 中的泛型,并通过具体实例帮助理解常见问题及其解决方法。泛型通过类型参数替代具体类型,提高了代码复用性和类型安全性,减少了运行时性能开销。文章详细介绍了如何定义泛型类和方法,并讨论了常见的易错点及解决方案,帮助读者更好地掌握这一技术。
21 11
|
1月前
|
编译器 C#
C#中内置的泛型委托Func与Action
C#中内置的泛型委托Func与Action
42 4
|
29天前
|
C#
C# 面向对象编程(三)——接口/枚举类型/泛型
C# 面向对象编程(三)——接口/枚举类型/泛型
24 0
|
4月前
|
存储 安全 Java
34.C#:listT泛型集合
34.C#:listT泛型集合
50 1
|
4月前
|
开发框架 安全 .NET
C# .NET面试系列三:集合、异常、泛型、LINQ、委托、EF!
<h2>集合、异常、泛型、LINQ、委托、EF! #### 1. IList 接口与 List 的区别是什么? IList 接口和 List 类是C#中集合的两个相关但不同的概念。下面是它们的主要区别: <b>IList 接口</b> IList 接口是C#中定义的一个泛型接口,位于 System.Collections 命名空间。它派生自 ICollection 接口,定义了一个可以通过索引访问的有序集合。 ```c# IList 接口包含一系列索引化的属性和方法,允许按索引访问、插入、移除元素等。 由于是接口,它只定义了成员的契约,而不提供具体的实现。类似于 IEnumera
318 2
|
4月前
|
存储 安全 算法
C# 泛型:类型参数化的强大工具
【1月更文挑战第7天】本文将深入探讨C#语言中的泛型编程,包括泛型的定义、用途、优势以及实际应用。通过类型参数化,泛型允许开发者编写更加灵活且可重用的代码,同时提高程序的类型安全性和性能。本文将通过示例代码和详细解释,帮助读者更好地理解泛型在C#中的重要性和实用性。
|
4月前
|
存储 Java 编译器
【从Java转C#】第五章:泛型
【从Java转C#】第五章:泛型
|
机器学习/深度学习 存储 缓存
一文带你搞懂C#泛型
泛型是.net 2.0中提供的新特性,是框架的一种升级,用于处理用一个事物来代替多种不同需求的情况。下面我们就一块来看一下具体的讲解吧。