C# 泛型编程基础实例详解

C# 泛型编程基础学习:最显著的一点就是它参数化了类型,把类型作为参数抽象出来,从而使我们在实际的运用当中能够更好的实现代码的重复利用,同时它提供了更强的类型安全,更高的效率,不过在约束方面,它只支持显示的约束,这样在灵活性方面就显得不是那么好了。我觉得它之所以能够提供更高的效率是因为泛型在实例化的时候采用了 "on-demand"的模式,即按需实例化,发生在JIT(Just In Time)编译时。

下面来看如何定义一个C# 泛型类,很简单,你只需要意识到一点,在这里,类型已经被参数化了:

C# 泛型编程实例:

 
 
 
  1. using System;   
  2. using System.Collections.Generic;   
  3. using System.Text;   
  4. namespace GenericTest   
  5. {   
  6.  class Program   
  7.  {   
  8.   static void Main(string[] args)   
  9.   {   
  10.    //使用string,int来实例化Test类   
  11.    Test t = new Test("SHY520",22);   
  12.    //调用泛型类中的方法   
  13.    t.SetValue();   
  14.   }   
  15.  }   
  16.  /**////   
  17.  /// 定义一个泛型类,该类有两个类型参数,分别是T,S   
  18.  ///   
  19.  /// 类型参数   
  20. /// 类型参数   
  21.  public class Test   
  22.  {   
  23.   //泛型类的类型参数可用于类成员   
  24.   private T name;   
  25.   private S age;   
  26.   public Test(T Name,S Age)   
  27.   {   
  28.    this.name = Name;   
  29.    this.age = Age;   
  30.   }   
  31.   public void SetValue()   
  32.   {   
  33.    Console.WriteLine(name.ToString());   
  34.    Console.WriteLine(age.ToString());   
  35.   }   
  36.  }   
  37. }  

上面的C# 泛型编程例子不是很恰当,目的是让初学C# 泛型的你了解一下泛型的定义及实例化方法,如上,我们定义了一个泛型类,那么如何实现泛型类的继承呢?这里需要满足下面两点中的任何一点即可:

1、C# 泛型类继承中,父类的类型参数已被实例化,这种情况下子类不一定必须是C# 泛型类;

2、父类的类型参数没有被实例化,但来源于子类,也就是说父类和子类都是泛型类,并且二者有相同的类型参数;

 
 
 
  1. //如果这样写的话,显然会报找不到类型T,S的错误   
  2. public class TestChild : Test { }   
  3. //正确的写法应该是   
  4. public class TestChild : Test{ }   
  5. public class TestChild : Test { }   
  6. public class TestChild : Test { }  

接着我们来看看泛型接口,其创建以及继承规则和上面说的泛型类是一样的,看下面的代码:

 
 
 
  1. public interface IList   
  2. {   
  3.  T[] GetElements();   
  4. }   
  5. public interface IDictionary   
  6. {   
  7.  void Add(K key, V value);   
  8. }   
  9. // 泛型接口的类型参数要么已实例化   
  10. // 要么来源于实现类声明的类型参数   
  11. class List : IList, IDictionary   
  12. {   
  13.  public T[] GetElements() { return null; }   
  14.  public void Add(int index, T value)   
  15.  {}   
  16. }  

在来看一下C# 泛型委托,首先我们定义一个类型参数为T的委托,然后在类中利用委托调用方法:

 
 
 
  1. using System;   
  2. using System.Collections.Generic;   
  3. using System.Text;   
  4. namespace GenericTest   
  5. {   
  6.  //定义一个委托,类型参数为T,返回值类型T   
  7.  //泛型委托支持在返回值和参数上应用类型参数   
  8. delegate string GenericDelete(T value);   
  9.  class test   
  10.  {   
  11.   static string F(int i) { return "SHY520"; }   
  12.   static string G(string s) { return "SHY520"; }   
  13.   static void Main(string[] args)   
  14.   {   
  15.    GenericDelete G1 = G;   
  16.    GenericDelete G2 = new GenericDelete(F);   
  17.   }   
  18.  }   

我们再来看C# 泛型方法,C#的泛型机制只支持在方法申明上包含类型参数,也即是泛型方法。特别注意的是,泛型不支持在除了方法以外的其他类/接口成员上使用类型参数,但这些成员可以被包含在泛型类型中,并且可以使用泛型类型的类型参数。还有一点需要说的就是,泛型方法可以在泛型类型中,也可以存在于非泛型类型中。下面我们分别看一下泛型类型的申明,调用,重载和覆盖。

 
 
 
  1. using System;   
  2. using System.Collections.Generic;   
  3. using System.Text;   
  4. namespace GenericTest   
  5. {   
  6.  class GenericClass   
  7.  {   
  8.   //申明一个泛型方法   
  9.   public T getvalue(T t)   
  10.   {   
  11.    return t;   
  12.   }   
  13.   //调用泛型方法   
  14.   //注意:在调用泛型方法时,对泛型方法的类型参数实例化   
  15.   public int useMethod()   
  16.   {   
  17.    return this.getvalue(10);   
  18.   }   
  19.   //重载getvalue方法   
  20.   public int getvalue(int i)   
  21.   {   
  22.    return i;   
  23.   }   
  24.  }   
  25.  //下面演示覆盖   
  26.  //要注意的是,泛型方法被覆盖时,约束被默认继承,不需要重新指定约束关系   
  27.  abstract class Parent   
  28.  {   
  29.   public abstract K TEST(K k, V v) where K : V;   
  30.  }   
  31.  class Child : Parent   
  32.  {   
  33.   public override T TEST(T t, S s)   
  34.   {   
  35.    return t;   
  36.   }   
  37.  }   
  38. }   
  39.  

C# 泛型编程基础实例的基本内容就向你介绍到这里,希望对你了解和学习C# 泛型编程基础有所帮助。

【编辑推荐】

  1. C# 泛型基础知识学习大全
  2. C# 泛型使用心得浅析
  3. C# 泛型集合概念及应用浅析
  4. C# 泛型集合实例应用浅析
  5. 浅析C# Dictionary泛型集合
免责声明:文章内容不代表本站立场,仅供读者参考。产品相关技术问题请发送工单。 本文链接:https://www.idc.net/help/405899/

为您推荐

开源数据收集引擎 Logstash 讲解和示例讲解

一、概述 Logstash 是一个开源的数据收集和日志处理工具,它是 Elastic Stack(ELK Stack)的一部分,用于从各种数据源中采集、转换和传输数据,以帮助分析和可视化大规模数据。Logstash 通常与 Elasticsearch 和 Ki...

八个开源免费单点登录(SSO)系统

单点登录(SSO)是一个登录服务层,通过一次登录访问多个应用。使用SSO服务可以提高多系统使用的用户体验和安全性,用户不必记忆多个密码、不必多次登录浪费时间。 下面推荐一些市场上最好的开源SSO系统,可作为商业SSO替代。 1.Authelia https://github.com/authelia/authelia ...

浅谈HBase数据结构和系统架构

Part 01 LSM树模型 常见的的关系型数据库,如MySQL、SQL Server、Oracle等,使用B+ Tree作为数据存储与索引的基本结构,非叶子节点只存放索引数据,叶子节点存放所有数据和指向相邻节点的指针,具有高效的范围查询和稳定的查找效率,以及具有较小的读放大和空间放大。采用磁盘随机读写方式,且以磁盘数...

微软Radius平台重构现代应用程序部署

微软的 Azure 孵化团队日前推出一个叫 Radius 的新应用平台。Radius 平台可用于在 Kubernetes、公共云和边缘环境中运行各种现代应用程序。 Radius 是一个开源项目,最初支持的应用程序运行时包括Kubernetes、Azure和AWS,以后还会支持诸如谷歌云平台等云环境。 Mark Russ...

Ext JS3.0正式版发布

Ext JS3.0在经历数次RC版之后,extjs.com终于发布3.0的正式版。总体而言,较2.0改进不大,依然还是原理的组件模型,具体更新及改进如下: ◆提供了参照DWR后与后台的通讯包Direct,支持具有明显的REST风格的CRUD服务 ◆一系列的新的组件和例子,包括有图表(Charting, By YUI F...
返回顶部