C#进阶-泛型

目录

1.泛型概念

2.泛型语法

 3.如何使用泛型

1.实例化泛型类

 2.对数组array初始化

3.循环-for循环和foreach循环

for循环

 foreach循环

4.泛型方法(再在泛型类中)

代码

泛型方法的调用(设置一个泛型方法,可实现多类型方法)

5.泛型接口

6.泛型接口的继承


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>();

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薄荷撞~可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值