• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

C#的泛型

武飞扬头像
AuraroTeen
帮助1

一、泛型的概念

允许我们延迟编写类或方法中的数据类型,直到真正使用时确定类型的一种规范

为什么要 用泛型:

1. 编写程序时,经常遇到两个模块的功能非常相似,区别只是一个是处理int数据,另一个是处理string数据,或者其他自定义的数据类型,我们只能分别写多个方法处理每个数据类型,因为方法的参数类型不同。

2. 针对 1 的情况,想到用object,来解决这个问题。但是这种方式有很大缺陷:
(1)会出现装箱、折箱操作,这将在托管堆上分配和回收大量的变量,性能损失非常严重。
(2)在处理引用类型时,虽然没有装箱和折箱操作,但将用到数据类型的强制转换操作,增加处理器的负担。 

二、泛型的方法

定义泛型方法需要在方法名和参数列表之间加上<>,并在其中使用 T 来代表参数类型。

实际上 T 可以用任何有效名称代替 ,也可以设置中文

  1.  
    static void Main(string[] args)
  2.  
    {
  3.  
    //调用
  4.  
     
  5.  
    // a可以是任何类型
  6.  
    TestMothod<int>(10);
  7.  
    TestMothod<string>("abc");
  8.  
    TestMothod<float>(12.0f);
  9.  
    }
  10.  
     
  11.  
     
  12.  
     
  13.  
    //定义
  14.  
     
  15.  
    public static void TestMothod<T>(T a) {
  16.  
     
  17.  
    Console.WriteLine(a.GetType().ToString());
  18.  
    }
学新通

三、泛型类

泛型类的定义与泛型方法类似,是在泛型类的名称后面加上<T>,当然,也可以定义多个类型,即“<T1,T2,・・・>“

  1.  
    static void Main(string[] args)
  2.  
    {
  3.  
    //调用
  4.  
     
  5.  
    //创建泛型类的对象
  6.  
     
  7.  
    FanXingClass<int> fanXingClass =new FanXingClass<int>();
  8.  
    fanXingClass.Age = 10;
  9.  
    fanXingClass.Cge = 20;
  10.  
    fanXingClass.FanXingMothod(300);
  11.  
    fanXingClass.FanXingMothod1(50,60);
  12.  
    }
  13.  
     
  14.  
     
  15.  
    //定义泛型类
  16.  
    public class FanXingClass<T,C>
  17.  
    {
  18.  
     
  19.  
    public T Age { get; set; }
  20.  
     
  21.  
    public C Cge { get; set; }
  22.  
    public void FanXingMothod(T a)
  23.  
    {
  24.  
     
  25.  
    Console.WriteLine(a.GetType().ToString());
  26.  
     
  27.  
    }
  28.  
    public void FanXingMothod1(T a, C b)
  29.  
    {
  30.  
    Console.WriteLine(a.GetType().ToString());
  31.  
    Console.WriteLine(b.GetType().ToString());
  32.  
    }
  33.  
     
  34.  
    }
学新通

四、泛型约束

几个常用的泛型约束:

   where T : struct                约束 T 必须是值类型  
   where K : class                约束 K 必须是引用类型 
   where V : IClass<T>        约束 V 必须继承  IClass<T> 接口
   where W : className      约束 W 必须是 className 类型,或者是 className 类型的子类 
   where X : class, new()     约束 X 必须是引用类型,并且有一个无参数的构造函数,当有多个约束时,new()必须写在最后  

  1.  
    static void Main(string[] args)
  2.  
    {
  3.  
    //泛型约束调用
  4.  
     
  5.  
    FanXingYueSu<int, string> fanXingYueSu = new FanXingYueSu<int, string>();
  6.  
    fanXingYueSu.FanXingYueSuMothod(102);
  7.  
    fanXingYueSu.FanXingYueSuMothod1("abc");
  8.  
     
  9.  
    }
  10.  
     
  11.  
    class FanXingYueSu<T,K> where T :struct where K :class //各个泛型约束之间用空格隔开
  12.  
    {
  13.  
     
  14.  
    public void FanXingYueSuMothod(T a) {
  15.  
     
  16.  
    Console.WriteLine(a.GetType().ToString());
  17.  
     
  18.  
    }
  19.  
    public void FanXingYueSuMothod1(K a)
  20.  
    {
  21.  
    Console.WriteLine(a.GetType().ToString());
  22.  
     
  23.  
    }
  24.  
     
  25.  
    }
学新通

五、泛型集合

概念

泛型集合是泛型中最常见的应用,主要用于约束集合中存放的元素。

1. ArrayList 动态数组  :

 ArrayList的优点:

   (1) ArrayList大小是按照其中存储的数据来动态扩充与收缩的

   (2) ArrayList 在声明对象时并不需要指定它的长度

   (3) ArrayList可以很方便地进行数据的添加插入删除

   (4) ArrayList 可以存储任意类型

ArrayList的缺点:
    (1) ArrayList在存储数据时使用object类型进行存储的
    (2) ArrayList不是类型安全的,使用时很可能出现类型不匹配的错误,就算都插入了同一类型的数据,使用时我们也需要将它们转化为对应的原类型来处理
    (3) ArrayList 存储在装箱和拆箱操作,导致其性能低下

2. List 泛型集合

     List与数组比较类似,都用于存放一组值。
     List的元素长度不固定 数组必须固定

定义个int类型泛型集合:

  1.  
    List<int> IntList = new List<int>();
  2.  
    //加入
  3.  
    IntList.Add(1);
  4.  
     
  5.  
    //删除
  6.  
    IntList.RemoveAt(0);

加入自定义的类型

  1.  
    //使用对象初始化器 c#语法糖
  2.  
    List<Person> persons = new List<Person>(); 
  3.  
    Person person = new Person()
  4.  
    {
  5.  
    Age = 18,
  6.  
    Height = 175,
  7.  
    Name = "gentle"
  8.  
     
  9.  
    };
  10.  
    persons.Add(person); //将整个对象添加到集合中
  11.  
     
  12.  
     
  13.  
    public class Person
  14.  
    {
  15.  
    public int Age { get; set; }
  16.  
    public int Height { get; set; }
  17.  
    public string Name { get; set; }
  18.  
    }
学新通


        

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhghegeb
系列文章
更多 icon
同类精品
更多 icon
继续加载