目录
1.泛型概念
泛型允许您编写一个可以与任何数据类型一起工作的类或方法。在VS中用新的控制台应用:App.config 是应用程序的配置文件,将来把一些重要配置(如:数据库连接字符串);放置到此文件中,通过代码来读取此文件获取相关数据,好处:应用程序很多文件的配置信息都可以保存到此处,配置信息要修改时,只需改一处。
提醒:配置文件修改后,需要重新编译,重新启动项目,让配置文件重新生效;
2.泛型语法
泛型类<T> T表示未知类型; 如:下列代码声明一个泛型类,数组
internal class GenericDemo<T>{
//数据类型是泛型T[]的数组
private T[] array;//声明
//设置值 T item形参是泛型
public void setItem(int index, T item)
{
array[index] = item;
}
//获取值 要返回类型
public T getItem(int index)//获取时,要写数据类型T
{
return array[index];
}
//在方法和字段中可以理解为 T 替换数据类型
3.如何使用泛型
1.实例化泛型类
GenericDemo<int> genericDemo1 = new GenericDemo<int>();
//这里是将T定义为int类型,也可以定义为其他类型
2.对数组array初始化
在泛型类中只定义了数组array,并没有对其初始化,这时候需要借助构造函数进行实例化,然后再初始化
//构造函数 定义数组长度
public GenericDemo(int size)
{
//给数组array实例化,并没有初始化
//赋值时调用 设置setItem()、获取getItem()方法
array = new T[size]
}
此时,在主函数中,一实例化,就会调用构造函数,构造函数一执行就会调用新数组new T[size],此时就可以对数组的长度进行传参
GenericDemo<int> genericDemo1 = new GenericDemo<int>(3);
genericDemo1.setItem(0, 10);
genericDemo1.setItem(1, 20);
genericDemo1.setItem(2, 20);
3.循环-for循环和foreach循环
for循环
跟据for循环语句知道,使用for循环要知道长度Lenght,所以要定义长度
public int Length { get; set; }//get,set需要返回具体值
//在构造函数中添加set
public GenericDemo(int size)
{
//给数组array实例化,并没有初始化
//设置setItem()、获取getItem()
array = new T[size];
Length = size;//设置set
}
//for循环
for(int i=0;i<genericDemo.Length;i++)
//根据循环体获取所需的值
{//genericDemo.Length拿的就是实例化的参数3,只有一实例化就通过构造函数获取形参
cw(genericDemo.getItem(i))
}
foreach循环
此时,要看定义的数组(字段)是私有private还是共有public;
foreach (var item in ·····);in 后面需要跟数组
//若是public则可直接调用
foreach (var item in genericDemo1.Array)
//若是私有private,则需要进行获取数组操作
//定义一个新数组返回array
public T[] MyArray
{
get
{
return array;
}
}
Console.WriteLine(item);
}
//循环
foreach (var item in genericDemo1.MyArray);
4.泛型方法(再在泛型类中)
代码
// 泛型方法:让方法也支持多种类型
public static void Add<T>(T x, T y)
{
Console.WriteLine($"x:{x},y:{y}");
}
泛型方法的调用(设置一个泛型方法,可实现多类型方法)
// 使用泛型方法
FunDemo<int>.Add<int>(10, 20);
FunDemo<string>.Add<string>("A", "B");
//可以简化
FunDemo<int>.Add(10, 20);
FunDemo<string>.Add("A", "B");
5.泛型接口
internal interface Interface1<T>{
//接口中方法不能实现。接口中的方法是ti公开
string GetValue(string x)
//在泛型接口中定义泛型方法,没有方法体
T GetValue<T>(T x);
}
6.泛型接口的继承
//设置一个泛型接口,可实现多类型
//1.继承类不是泛型
internal class Class1 : Interface1<int>
{
public T GetValue<T>(T x)
{
return x;
}
}
internal class Class2 : Interface1<string>
//2.继承类是泛型(约定了接口类型)
internal class Class3<K> : Interface1<K>
{
public K GetValue<K>(K x)
{
return x;
}
}
//实例化,类要确定泛型
Class3<float> class3 = new Class3<float>();