第四部分 稍微梳理一下就是 之前很不懂的泛型知识
首先为什么要用泛型呢,因为他省内存,不用反复写
代码量比较小,只需要一个实现就可以了。
只有在需要的时候才会实例化,
而且!!易于维护,只要修改模板,所有实例都会改变。
(泛型类是一个容器,类的模型)
泛型类:
public class Cage<T>{T[] array;//类型的数组readonly int size;//只读的整形大小int num;//数量public Cage(int n)//构造函数{size = n;num = 0;array = new T[size];}//这里创造了一个泛型类 笼子cage,这样子之后本来已经有的猫狗就可以直接定义了public void PutIn(T pet)//输入数组的方法//T类型{if(num<size){array[num++] = pet;//宠物数量++}else{Console.WriteLine(\"Cage is full\");}}
class Program{static void Main(string[] args){var catCage = new Cage<Cat>(3);catCage.PutIn(new Cat(\"A\"));catCage.PutIn(new Cat(\"b\"));catCage.PutIn(new Cat(\"c\"));var cat = catCage.TakeOut();cat.printName();}//在这里 直接就定义了一个cage的cat,然后只需要用设置好的putin函数直接调入}
泛型方法:就是方法的模型
public void ishappy<T>(T target){Console.WriteLine(\"happy\");}//先是在Cat类中定义了这个泛型方法
然后紧接着在主程序中实现了他的
//泛型方法cat.ishappy<Person>(new Person());//不理解cat.ishappy<int>(10);//不理解,看见10很开心????/
但是我没有很理解,为什么int 10之后,什么都不用识别,就可以直接在输出中直接执行呢?
不需要条件判断吗?直接输入参数就可以输出函数了吗?
//因为这个泛型方法本身没有条件判断,无论是多少都会直接输出。
泛型方法 约束,
其中类名,class,struct只能约束一个,
接口则可以无限多约束,
new();
public void isnothappy<T>(T target) where T:Pet{//另外一个泛型方法,其中加了个约束,所有将只能用pet或者其派生的类Console.WriteLine(\"nothappy bacuse\");target.printName();}
泛型接口,没有学懂。
最后一个部分的内容,各种集合。
其中数组array是最基础的用法,【】
其他的分别是
0.数组
Pet[] pets = new Pet[] { new Dog(\"狗\"), new Cat(\"猫\") };for(int i=0;i<pets.Length;++i){pets[0].printName();}Dog.ShowNum();
1.动态数组:(小叶昨晚刚刚跟我讲)
因为其不用在一开始定义的时候就定好大小,他可以随意补充大小。
而且其内置有函数,获取数组长度(count),增加add,remoe,访问
//动态数组List<Dog> dogs = new List<Dog>();dogs.Add(new Dog(\"1\"));dogs.Add(new Dog(\"2\"));dogs.Add(new Dog(\"3\"));dogs.RemoveAt(0);for (int i = 0; i < dogs.Count; i++){dogs[i].printName();}
2.字典类型:Dictionary< T key,T value>
主要的好处是,可以自己定义key索引,搜索方便。
//字典类型Dictionary<string, Dog> dic = new Dictionary<string, Dog>();dic.Add(\"sb\", new Dog(\"A\"));dic[\"sb\"].printName();
3.栈(先进后出,后进先出)
其中的(指令)有,
出栈,pop,
入栈,push,
获取顶端元素,,peek
//栈Stack<Dog> stack = new Stack<Dog>();stack.Push(new Dog(\"GU\"));stack.Push(new Dog(\"GU2\"));stack.Peek().printName();stack.Pop();stack.Peek().printName();
4.队列,先进先出
出队 Dequeue
入队 Eequque
//队列Queue<Pet> queue = new Queue<Pet>();queue.Enqueue(new Dog(\"P\"));queue.Enqueue(new Cat(\"O\"));//下面这步是为什么Pet pet = null;// Pet pet = queue.Dequeue应该这么写,出来到这里pet = queue.Dequeue();pet.printName();pet = queue.Dequeue();pet.printName();//依次出队
其中三四的栈跟队列之中都有一个特点,就是所有在使用的使用的时候,都需要先让他们导出来,才能使用,根据我现在的知识,队列还需要多一个位置来存放他。
最后一个 内容 委托
delegate 没学会
Lambda表达式
事件的触发和注册,
发布者跟订阅者。