• 泛型


    泛型 
    对参数类型进行了一个规定

    ArrayList 

    一个可变的object数组,长度可变,里面可以放任意类型的值,每一个值放进去都是object类型

    麻烦:数据放进去就不知道是什么类型的了;不能防止非法类型数据的放入;

    Dictionary(字典)

    Key -value Pair: 键值对,键不可以重复,但是值可以重复
    Dictionary<K,V>:K:键的类型,V:值的类型

    Dictionary<string,int> dic = new Dictionary<string,int>();//声明了一个键为string类型,对应值为int的字典


    Add():添加,如果重复,则报错
    索引器方式设置值:可以重复设置,即使不存在也没关系,如果重复则新数据覆盖旧数据
    ContainsKey(),判断是否存在这个Key
    放进去的数据可能和遍历出来的数据的顺序不一样

    Dictionary<K,V>的非泛型对应的是Hashtable;List<T>→ArrayList

    数据库主键、索引、ASP中的Cookie等都有字典的影子

    泛型的声明

     在类的声明后面约定一个类型

    泛型类的声明

    <span style="white-space:pre">	</span>class DateContainer<T>	
    	//约定了一个待定类型T,T可以为其它名字。类中所有用类型的地方都可以用T代替
    	{
    		public T Data{get;set;}
    		public T GetData()
    		{
    			return Date;
    		}
    		public void Hello(T t1,string s)
    		{
    			
    		}
    	}


    声明变量:
    DateContainer<int> dc = new DateContainer<int>();//和List<int> 就是一样的
    dc.Data = 5;
    int res = dc.GetData();

    类型后面可以有多个类型约束符

    	class Data<TKey,TValue>
    	{
    		public TKey key{get;set}
    		public TValue value{get;set;}
    	}

    泛型方法 

    在方法名后面声明约束类型。有效期就在这个方法体内

    //泛型方法,在方法内部、参数、返回值都可以用这个类型代替

    	static void Hello<T1,T2>(T1 i1,T2 i2)
    	{
    	
    	}

    泛型委托 

    	delegate void MyDelegate<T1,T2>(T1 i1,T2 i2);	//类型约束类型个数同样可以改变
    	
    	static void H1(bool b1,int i1)
    	{
    	
    	}
    	//声明一个委托对象,指定约束的类型,指向一个复合类型约束的的方法
    	MyDelegate<bool,int> md = H1;


    系统定义的泛型委托:delegate void TRest Func<TRest>();以及其它重载的委托

    泛型约束 

    泛型的约束通过关键字where来完成

        约束泛型方法 

    		// where T:new()	//约束类型T必须有一个无参的构造函数。只是能够约束无参的构造函数
    		static List<T> CreatList<T>(int n) where T:new()	//约束类型T必须有一个无参的构造函数
    		{
    			List<T> list = new List<T>();
    			for(int i=0 i<n; i++)
    			{
    				//约束了这个类型T必须有一个无参的构造函数.如果不约束是不能够创建的
    				T p = new T();	
    				list.Add(p);
    			}
    			return list;
    		}

    约束类/接口

    		//约束类型T必须是继承至类Person或者是Person类
    		class PersonList<T> where T:Person
    		{
    			public void DotIt(T p1)
    			{
    				//因为约定了T必须是继承自Person,所以可以再内部调用Person中的东东
    				p1.Name = "aaa";
    			}
    		}
    		
    		class Person
    		{
    			public string Name{get;set;}
    		}
    		
    		class Chinese:Person
    		{
    		}
    		//声明这种类型的对象
    		PersonList<Person> lists = new PersonList<Chinese>();

    委托约束

    delegate void MyDelegate<T1,T2>(T1 s1,T2 s2) where T1:Person

    多个类型约束

    就用多个where条件,以约束泛型类为例:

    		class CountPerson<T1,T2,T3> where T1 : Person where T2:string where T3:Object
    		{
    
    		}


    int? 类型

    最终就编译成了一个Nullable<int>类型。

    Nullable<T>,就是一个泛型,约束了T必须是一个struct
    public struct Nullable<T> where T: struct
    {
    }


    Lazy<T> 

    懒惰对象,当我们真正使用的时候才会真正的创建T对象

    Lazy<Person> person = new Lazy<Person>();//这句话的执行并不会去调用构造函数
    .......
    .......
    person.Value.Hello();//Lazy的Value用来获得延迟创建的对象,
    //会先判断这个对象有没有创建,创建了直接返回,没有创建就创建一个对象




  • 相关阅读:
    【ccf线上赛普及组 2020】
    【小总结】2020.3.6
    DP优化
    noip2012day2
    noip2012day1
    3.28真题
    数据结构总结
    noi online 普及组
    小总结
    20200229模拟赛
  • 原文地址:https://www.cnblogs.com/qigang/p/3841932.html
Copyright © 2020-2023  润新知