Loading...
墨滴

莫激

2021/12/13  阅读:32  主题:默认主题

c#中的泛型

泛型

什么是泛型

  • 泛型实现了类型参数化,达到代码重用目的(例如下面泛型类和接口中的代码)
  • 通过类型参数化来实现同一份代码上操作多种类型(这就是重写的意思)
  • 泛型相当于类型占位符,比如:public T vlaue中的T
  • 定义类或方法时使用替代符代表变量类型
  • 当真正使用类或者方法时具体指定类型

泛型分类

泛型类和基本语法

class 类名<泛型占位字母>

泛型接口和基本语法

interface 接口名<泛型占位字母>

泛型函数基本语法

函数名<泛型占位字母>(参数列表)

  • 泛型字母一般都是写大写字母就可以,任何都可以
  • 泛型占位字母可以有多个,用逗号分开

泛型类和接口

泛型类

//申明泛型类
class TestClass<T>
{
  public T value//这个就叫类型占位符
}

//主函数中使用时候,这就叫类型参数化
TestClass<int> t = new TestClass<int>();
t.value = 10;
//上面在TestClass类中定义int类型,这里又定义string类型,就做到了代码重用
TestClass<string> t2 = new TestClass<string>();
t2.value = "123123";

泛型接口

interface TestInterface<T//声明泛型接口
{
 T Value
    {
     get
     set;
    }
}
//实现接口时候,要使用接口中所有属性方法等
class Test:TestInterface<T>
{
 public int Value
    {
    }
}

泛型方法

普通类中的泛型方法

//声明普通类中的泛型方法
class test
{
    public void testFun<T>(T value)//有参数形式
    {
        Console.WriteLine(value);
    }
    public void testFun<T>()//无参数形式
    {
        default(T); //default里面填类型变量
    }
    public T testFun<T>()
    {
        return default(T);
    }
}

//主函数中使用
public static void main(String[]args)
{
    test t2 = new test();
    t2.testFun<string>("123123"); //结果是123123
}

泛型类中的泛型方法

//泛型类中的泛型方法
class Test2<T>
{
 public T value;
    //这种才是泛型方法,可以动态的去变化类型变量
    public void TestFun<K>(K k)
    {
        Console.WriteLine();
    }
 //这个不叫泛型方法,因为T是泛型类申明的时候就指定
 //再使用这个函数的时候,我们不能再去动态的变化了
 public void TestFun(T t)
    {
    
    }
}

//主函数中使用
public static void main(String[]args)
{
    Test2<int> t2 = new Test2<int>();
    t2.TestFun<String>("23123");//泛型方法
    t2.TestFun<int>(5);//泛型方法
    t2.TestFun(int 5);//这里int是不能改的,这里的T是受类中的泛型影响的
}

泛型的作用

  • 不同类型对象的相同逻辑处理就可以选择泛型

  • 使用泛型可以一定程度避免装箱拆箱

    举例:优化ArrayList

    class ArrayList<T>
    {
     private T[]array;
     public void Add(value)
     {}
     public void Remove(value)
     {}
    }

总结

  • 申明泛型时,它只是一个类型的占位符
  • 泛型真正起作用的时候,是在使用它的时候
  • 泛型占位字母可以有n个,记得用逗号隔开
  • 泛型占位字母一般是大写字母
  • 不确定泛型类型时,获取默认值,可以使用default(占位字符),如default(T)
  • 看到<>包括的字母 那肯定是泛型

练习

  • 通过泛型编写一个功能完整的数组

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

namespace A
{
    class ArrayList<T>
    {
        T[] array; //数组
        int count = 0//存储个数

        public ArrayList(int size)//有参构造函数
        {
            array = new T[size];
        }

        public ArrayList():this(10)//构造函数
        {

        }

        //增
        public void Add(value) 
        {
            if (count == array.Length-1)
            {
                Console.WriteLine("数组已经饱和");
            }
            array[count] = value;
            count++;
        }
        //删除
        public void ReMoveAt(int index)//根据索引删除
        {
            for (int i = index; i < array.Length-1; i++)
            {
                array[i + 1] = array[i];
                
            }
            count--;
        }
        public void ReMove(value)
        {
            if (array.Contains(value))//判断数组中有没有value
            {
                for (int i = 0; i < array.Length; i++)
                {
                    if (array[i].Equals(value))
                    {
                        ReMoveAt(i);
                    }
                }
            }
            else
            {
                Console.WriteLine("数组里面没有{0}",value);
            }
            
        }
        //清空
        public void Clear()
        {
            count = 0;
        }

        //查
        public int view()
        {
            return count;
        }

        public T LookValue(int index)//根据索引查值
        {
            for (int i = 0; i < array.Length; i++)
            {
                if (index == i)
                {
                    return array[i];
                }
            }
            return default(T);
        }

        public int LookIndex(value)//根据值查索引
        {

            if (array.Contains(value))
            {
                for (int i = 0; i < array.Length; i++)
                {
                    if (array[i].Equals(value))
                    {
                        return i;
                    }
                }
            }
            else
            {
                Console.WriteLine("数组中没有{0}值",value);
            }
            
            return 0;
        }
        //改
        public void Gai(int index,T value)
        {
            if (index >= 0 && index < count)
            {
                array[index] = value;
            }
            else
            {
                Console.WriteLine("您输入的值有错误");
            }
            
        }
        //插入
        public void Insert(int index, T value)
        {
            for (int i = count-1; i >=index; i--)
            {
                array[i + 1] = array[i];
            }
            array[index] = value;
        }
       

    }
    
    class Program
    {
        static void Main(string[] args)
        {
            ArrayList<string> arraylist= new ArrayList<string>();
            arraylist.Add("asdasd");
            arraylist.Add("qweqwe");
            arraylist.Add("大鸡腿");
            arraylist.Add("小鸡腿");
           
            Console.WriteLine(arraylist.LookValue(1));//查看索引为1的值
            Console.WriteLine(arraylist.view());//查看数组有多少个值
            arraylist.ReMoveAt(1);//删除索引为1的值
            
            Console.WriteLine(arraylist.view());
            arraylist.ReMove("asdasd");//删除值为"asdasd"的
            Console.WriteLine(arraylist.LookIndex("asdasd"));//查看值为asdasd的索引
            
            arraylist.Insert(1"你是傻逼");//插入
            Console.WriteLine(arraylist.LookValue(1));//查看索引为1的值
            Console.ReadKey();
        }
    }
}

莫激

2021/12/13  阅读:32  主题:默认主题

作者介绍

莫激