(五十三)C#编程基础复习——C#泛型(Generic)

发布时间 2024-01-08 11:40:08作者: 代号六零一

在C#中,泛型(Generic)是一种规范,它允许我们使用占位符来定义类和方法,编译器会在编译时将这些占位符替换为指定的类型,利用泛型的这一特性我们可以定义通用类(泛型类)或方法(泛型方法)。

定义通用类需要使用尖括号<>,这里的尖括号用于将类或方法声明为泛型。下面通过一个简单的实例来帮助您理解这个概念:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
using System.Runtime.InteropServices;

namespace _047
{
    /// <summary>
    /// 定义泛型类
    /// </summary>
    class GenericClass<T>
    {
        //泛型方法
        public GenericClass(T msg)
        {
            Console.WriteLine(msg);
        }
    }
    internal class Program
    {
        static void Main(string[] args)
        {
            GenericClass<string> str_gen = new GenericClass<string>("C#语言");
            GenericClass<int> int_gen = new GenericClass<int>(12345);
            GenericClass<char> char_gen = new GenericClass<char>('C');
            Console.ReadKey();

        }
    }
}

一、泛型的特性

可以将泛型看作是一种增强程序功能的技术,泛型类和泛型方法兼具可重用性、类型安全性和效率,这是非泛型类和非泛型方法无法实现的。泛型通常与集合以及作用于集合的方法一起使用,System.Collections.Generic命名空间下就包含几个基于泛型的集合类。下面总结了一些关于泛型的特性:

  1. 使用泛型类型可以最大限度地重用代码、保护类型的安全性以及提高性能;
  2. 泛型最常见的用途是创建集合类;
  3. .NET类库在System.Collections.Generic命名空间中包含几个新的泛型集合类,你可以使用这些类来代替System.Collection中的集合类;
  4. 你可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托;
  5. 你也可以对泛型类进行约束以访问特定数据类型的方法;
  6. 在泛型数据类型中所用类型的信息可在运行时通过使用反射来获取。

二、泛型方法

在上面的示例中我们已经使用了泛型类,除此之外我们可以通过类型参数声明泛型方法。下面通过示例程序来演示一下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections.Generic;

namespace _048
{
    internal 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("调用swap之前的int值为:");
            Console.WriteLine("a={0},b={1}",a,b);
            Console.WriteLine("调用swap之前的char值为:");
            Console.WriteLine("c={0},d={1}",c,d);

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

            //在交换之后显示值
            Console.WriteLine("调用swap之后的int值:");
            Console.WriteLine("a={0},b={1}",a,b);
            Console.WriteLine("调用swpa之后的char值:");
            Console.WriteLine("c={0},d={1}",c,d);
            Console.ReadKey();

        }
    }
}

三、泛型委托

我们还可以使用类型参数定义泛型委托,如下所示:

delegate T NumberChanger<T>(T n);

下面通过示例演示下泛型委托的使用:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace _049
{
    internal class Program
    {
        delegate T NumberChanger<T>(T n);
        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("Num的值为:{0}",getNum());
            nc2(5);
            Console.WriteLine("Num的值为:{0}",getNum());
            Console.ReadKey();
        }
    }
}