实例讲解C# 泛型(Generic)

 更新时间:2020年06月29日 15:10:52   作者:菜鸟教程  
这篇文章主要介绍了C# 泛型(Generic)的的相关资料,文中示例代码非常详细,帮助大家参考和学习,感兴趣的朋友可以了解下

泛型(Generic) 允许您延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程序中使用它的时候。换句话说,泛型允许您编写一个可以与任何数据类型一起工作的类或方法。

您可以通过数据类型的替代参数编写类或方法的规范。当编译器遇到类的构造函数或方法的函数调用时,它会生成代码来处理指定的数据类型。下面这个简单的实例将有助于您理解这个概念:

using System;
using System.Collections.Generic;

namespace GenericApplication
{
  public class MyGenericArray<T>
  {
    private T[] array;
    public MyGenericArray(int size)
    {
      array = new T[size + 1];
    }
    public T getItem(int index)
    {
      return array[index];
    }
    public void setItem(int index, T value)
    {
      array[index] = value;
    }
  }
      
  class Tester
  {
    static void Main(string[] args)
    {
      // 声明一个整型数组
      MyGenericArray<int> intArray = new MyGenericArray<int>(5);
      // 设置值
      for (int c = 0; c < 5; c++)
      {
        intArray.setItem(c, c*5);
      }
      // 获取值
      for (int c = 0; c < 5; c++)
      {
        Console.Write(intArray.getItem(c) + " ");
      }
      Console.WriteLine();
      // 声明一个字符数组
      MyGenericArray<char> charArray = new MyGenericArray<char>(5);
      // 设置值
      for (int c = 0; c < 5; c++)
      {
        charArray.setItem(c, (char)(c+97));
      }
      // 获取值
      for (int c = 0; c < 5; c++)
      {
        Console.Write(charArray.getItem(c) + " ");
      }
      Console.WriteLine();
      Console.ReadKey();
    }
  }
}

当上面的代码被编译和执行时,它会产生下列结果:

0 5 10 15 20
a b c d e

泛型(Generic)的特性

使用泛型是一种增强程序功能的技术,具体表现在以下几个方面:

  • 它有助于您最大限度地重用代码、保护类型的安全以及提高性能。
  • 您可以创建泛型集合类。.NET 框架类库在 System.Collections.Generic 命名空间中包含了一些新的泛型集合类。您可以使用这些泛型集合类来替代 System.Collections 中的集合类。
  • 您可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。
  • 您可以对泛型类进行约束以访问特定数据类型的方法。
  • 关于泛型数据类型中使用的类型的信息可在运行时通过使用反射获取。

泛型(Generic)方法

在上面的实例中,我们已经使用了泛型类,我们可以通过类型参数声明泛型方法。下面的程序说明了这个概念:

using System;
using System.Collections.Generic;

namespace GenericMethodAppl
{
  class Program
  {
    static void Swap<T>(ref T lhs, ref T rhs)
    {
      T temp;
      temp = lhs;
      lhs = rhs;
      rhs = temp;
    }
    static void Main(string[] args)
    {
      int a, b;
      char c, d;
      a = 10;
      b = 20;
      c = 'I';
      d = 'V';

      // 在交换之前显示值
      Console.WriteLine("Int values before calling swap:");
      Console.WriteLine("a = {0}, b = {1}", a, b);
      Console.WriteLine("Char values before calling swap:");
      Console.WriteLine("c = {0}, d = {1}", c, d);

      // 调用 swap
      Swap<int>(ref a, ref b);
      Swap<char>(ref c, ref d);

      // 在交换之后显示值
      Console.WriteLine("Int values after calling swap:");
      Console.WriteLine("a = {0}, b = {1}", a, b);
      Console.WriteLine("Char values after calling swap:");
      Console.WriteLine("c = {0}, d = {1}", c, d);
      Console.ReadKey();
    }
  }
}

当上面的代码被编译和执行时,它会产生下列结果:

Int values before calling swap:
a = 10, b = 20
Char values before calling swap:
c = I, d = V
Int values after calling swap:
a = 20, b = 10
Char values after calling swap:
c = V, d = I

泛型(Generic)委托

您可以通过类型参数定义泛型委托。例如:

delegate T NumberChanger<T>(T n);

下面的实例演示了委托的使用:

using System;
using System.Collections.Generic;

delegate T NumberChanger<T>(T n);
namespace GenericDelegateAppl
{
  class TestDelegate
  {
    static int num = 10;
    public static int AddNum(int p)
    {
      num += p;
      return num;
    }

    public static int MultNum(int q)
    {
      num *= q;
      return num;
    }
    public static int getNum()
    {
      return num;
    }

    static void Main(string[] args)
    {
      // 创建委托实例
      NumberChanger<int> nc1 = new NumberChanger<int>(AddNum);
      NumberChanger<int> nc2 = new NumberChanger<int>(MultNum);
      // 使用委托对象调用方法
      nc1(25);
      Console.WriteLine("Value of Num: {0}", getNum());
      nc2(5);
      Console.WriteLine("Value of Num: {0}", getNum());
      Console.ReadKey();
    }
  }
}

当上面的代码被编译和执行时,它会产生下列结果:

Value of Num: 35
Value of Num: 175

以上就是实例讲解C# 泛型(Generic)的详细内容,更多关于C# 泛型(Generic)的资料请关注脚本之家其它相关文章!

相关文章

  • C#读取XML的CDATA节点内容实例详解

    C#读取XML的CDATA节点内容实例详解

    在本篇文章里小编给大家整理了关于C# 读取XML的CDATA节点内容的相关知识点内容,有需要的朋友们参考学习下。
    2019-09-09
  • C#使用RabbitMQ的详细教程

    C#使用RabbitMQ的详细教程

    RabbitMQ 是一个功能强大的消息队列系统,可用于在分布式系统中进行可靠的消息传递,本篇博客将详细介绍如何在 C# 中使用 RabbitMQ 实现各种消息队列操作,并通过代码介绍的非常详细,需要的朋友可以参考下
    2024-08-08
  • c#对象初始化顺序实例分析

    c#对象初始化顺序实例分析

    这篇文章主要介绍了c#对象初始化顺序,实例分析了C#对象初始化的相关使用技巧与调用顺序,需要的朋友可以参考下
    2015-06-06
  • C#winform中数据库绑定DataGrid的实现

    C#winform中数据库绑定DataGrid的实现

    本文主要介绍了C#winform中数据库绑定DataGrid的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • C#如何生成唯一订单号

    C#如何生成唯一订单号

    这篇文章主要为大家详细介绍了C#如何生成唯一订单号,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • C#中ListView控件实现窗体代码

    C#中ListView控件实现窗体代码

    这篇文章主要介绍了C#中ListView控件实现窗体的核心代码,非常不错,具有参考借鉴价值,对c#listview相关知识感兴趣的朋友一起学习吧
    2016-08-08
  • C#实现输入10个数存入到数组中并求max和min及平均数的方法示例

    C#实现输入10个数存入到数组中并求max和min及平均数的方法示例

    这篇文章主要介绍了C#实现输入10个数存入到数组中并求max和min及平均数的方法,涉及C#简单数据转换与数值运算相关操作技巧,需要的朋友可以参考下
    2017-07-07
  • C#实现Array,List,Dictionary相互转换

    C#实现Array,List,Dictionary相互转换

    这篇文章介绍了C#实现Array,List,Dictionary互相转换的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C#命令模式用法实例

    C#命令模式用法实例

    这篇文章主要介绍了C#命令模式用法,以实例形式较为详细的分析了C#命令模式的功能、定义及使用技巧,需要的朋友可以参考下
    2015-07-07
  • C#画图之饼图折线图的实现方法

    C#画图之饼图折线图的实现方法

    这篇文章主要介绍了C#画图之饼图折线图的实现方法,以实例形式讲述了C#画图的完整实现过程,是非常实用的技巧,有不错的借鉴价值,需要的朋友可以参考下
    2014-09-09

最新评论