zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C#学习记录——泛型

2023-09-11 14:14:49 时间

泛型概述

泛型是用于处理算法、数据结构的一种编程方法。泛型的目标是采用广泛适用和可交互性的形式来表示算法和数据结构,以使它们能够直接用于软件构造。泛型类、结构、接口、委托和方法可以根据它们存储和操作的数据的类型来进行参数化。泛型能在编译时提供强大的类型检查,减少数据类型之间的显示转换、装箱操作和运行时的类型检查。泛型类和泛型方法同时具备可重用性、类型安全和效率高等特性,这是非泛型类和非泛型方法无法具备的。泛型通常用在集合上运行的方法中。
泛型主要是提高了代码的重用性,比如,可以将泛型看成是一个可以回收的包装箱A。如果在包装箱A上贴上苹果标签,就可以在包装箱A里装上苹果进行发送;如果在包装箱A上贴上香蕉标签,就可以在包装箱A里装上香蕉进行发送。

泛型的使用

类型参数T

(1)使用描述性名称命名泛型类型参数,除非单个字母名称完全可以让人了解它表示的含义,而描述性名称不会有更多的意义。
例如:

public interface ISessionChannel<Session>
public delegate TOutput Converter<Input,Output>

(2)将T作为描述性类型参数名的前缀。
例如:

public interface ISessionChannel<T>
{
	T Session{get;}
}

泛型接口

泛型接口的声明形式如下。

interface 【接口名】<T>
{
	【接口体】
}

声明泛型接口时,与声明一般接口的唯一区别是增加了一个。一般来说,声明泛型接口与声明非泛型接口遵循相同的规则。泛型类型声明所实现的接口必须对所有可能的构造类型都保持唯一。否则就无法确定该为某些构造类型调用哪个方法。
实例:

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

namespace Alei2023
{
	//创建一个泛型接口
	public interface ISessionChannel<T>
	{
		T CreateInstance();                 //接口中调用CreateInstance方法
	}
	//实现上面泛型接口的泛型类
	//派生约束where T : TI (T要继承自TI)
	//构造函数约束where T :new()(T可以实例化)
	public class Factory<T,TI>;IGenericInterface<TI> where T :TI,new() 
	{
		public TI CreateInstance()         //创建一个公共方法CreateInstancereturn new T();}
	class Programstatic void Main(string[] args)
		{
			//实例化接口
			IGenericInterface<System.ComponentModel.IListSource> factory = new Factory<System.Data.DataTable, System.ComponentModel.IListSource>();
			//输出指定泛型的类型
			Console.WriteLine(factory.CreateInstance().GetType().ToString());
			Console.ReadLine();
		}}

泛型方法

泛型方法的声明形式如下。

【修饰符】 Void 【方法名】<类型参数T>
{
	【方法体】
}

泛型方法是在声明中包括了类型参数T的方法。泛型方法可以在类、结构或接口声明中声明,这些类、结构或接口本身可以是泛型或非泛型。如果在泛型类型声明中声明泛型方法,则方法体可以同时引用该方法的类型参数T和包含该方法的声明的类型参数T。

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

namespace Alei2023
{
	public class Finder                                      //建立一个公共类Finder
	{
		public static int Find<T>(T[] items, T item)         //创建泛型方法forint i = 0;i < items.Length;i++//调用for循环if (items[i].Equals(item)//调用Equals方法比较两个数return i ;                              //返回相等数在数组中的位置
				}
			}
			return -1 ;                                     //如果不存在指定的数,则返回-1}
	class Programstatic void Main(string[] args)
		{
			//实例化接口
			int i = Finder.Find<int>(new int[] { 1, 2, 3, 4, 5, 6, 8, 9}, 6); //调用泛型方法,并定义数组指定数字
			Console.WriteLine("6在数组中的位置:"+ i.ToString());     //输出中数字在数组中的位置
			Console.ReadLine();
		}}