关键词:
该例子来自于微软官方,虽然讲的很好,但是个人的理解还是非常不到位的。特别是关于委托管理的细节问题,梳理得不是特别清楚。将其摘要于下。也希望牛人将其结构予以较完整的疏离,特别是其中事件触发地方。
该例子是对通过基于集合的泛型类来构建一个自定义的类,并且基于四个方法,重写了其增删改查的操作。
该例子是通过一个改变的改变的通知事件,在每一个方法的最后被触发。其中,DinosaursChangedEventArgs被作为事件信息。
Program.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections.ObjectModel; namespace Collection_Generic2 { class Program { static void Main(string[] args) { //初始化类 dinosaurs dino = new dinosaurs(); dino.Changed += ChangeHandler; //这个地方理解的不是很好 dino.Add("Psiticosaurus"); dino.Add("Caudipteryx"); dino.Add("Compsognathus"); dino.Add("Muttaburrasaurus"); Display(dino); Console.WriteLine(" IndexOf("Muttaburrasaurus"):{0}", dino.IndexOf("Muttaburrasaurus")); Console.WriteLine(" Contains("Caudipteryx"):{0}", dino.Contains("Caudipteryx")); Console.WriteLine(" Insert(2,"Nanotyrannus")"); dino.Insert(2,"Nanotyrannus"); Console.WriteLine(" dino[2]:{0}",dino[2]); Console.WriteLine(" dino[2]="Microraptor"", dino[2]="Microraptor"); Console.WriteLine(" Remove ("Microraptor")"); dino.Remove("Microraptor"); Console.WriteLine(" RemoveAt(0)"); dino.RemoveAt(0); Display(dino); Console.ReadLine(); } private static void ChangeHandler(object source, dinosaursChangedEventArgs e) { if (e.ChangeType == ChangeType.Replaced) { Console.WriteLine("{0} was replaced with {1}", e.ChangedItem, e.ReplaceWith); } else if (e.ChangeType == ChangeType.Cleared) { Console.WriteLine("The dinosaur list was cleared"); } else { Console.WriteLine("{0} was {1}", e.ChangedItem, e.ChangeType); } } private static void Display(Collection<string> cs) { Console.WriteLine(); foreach (string item in cs) { Console.WriteLine(item); } } } }
dinosaurs.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections.ObjectModel; namespace Collection_Generic2 { //继承泛型集合 class dinosaurs : Collection<string> { //该处类似于侦查其是否发送改变,一旦发生改变,则触发方法 public event EventHandler<dinosaursChangedEventArgs> Changed; /// <summary> /// 重写InsertItem方法 /// </summary> /// <param name="index"></param> /// <param name="item"></param> protected override void InsertItem(int index, string newItem) { base.InsertItem(index, newItem); EventHandler<dinosaursChangedEventArgs> temp = Changed; if (temp != null)//增强稳健型 { //如果发生改变,那么就添加一个新的项目进入指定位置 //this在这里是什么作用呢?没有想得特别明白 temp(this, new dinosaursChangedEventArgs(ChangeType.Added, newItem, null)); } } /// <summary> /// 这个更换的功能的重写 /// </summary> /// <param name="index"></param> /// <param name="NewItem"></param> protected override void SetItem(int index, string NewItem) { string replaced = Items[index]; base.SetItem(index, NewItem); EventHandler<dinosaursChangedEventArgs> temp = Changed; if (temp != null) { temp(this, new dinosaursChangedEventArgs(ChangeType.Replaced, replaced, NewItem)); } } /// <summary> /// 重写移除操作 /// </summary> /// <param name="index"></param> protected override void RemoveItem(int index) { //Items获取其列表的内容 string removedItem = Items[index]; base.RemoveItem(index); //代理改变这一事件,将其进行赋值 EventHandler<dinosaursChangedEventArgs> temp = Changed; if (temp != null) { temp(this, new dinosaursChangedEventArgs(ChangeType.Removed, removedItem, null)); } } protected override void ClearItems() { base.ClearItems(); EventHandler<dinosaursChangedEventArgs> temp = Changed; if (temp!=null) { temp(this,new dinosaursChangedEventArgs(ChangeType.Cleared,null,null)); } } } /// <summary> /// 改变的事件的参数 /// </summary> public class dinosaursChangedEventArgs : EventArgs { public readonly string ChangedItem; public readonly ChangeType ChangeType; public readonly string ReplaceWith; /// <summary> /// 和类名相同,这样它应该算作重载 /// 其内容是通过重载,对类的三个属性进行赋值 /// </summary> /// <param name="change"></param> /// <param name="item"></param> /// <param name="replacement"></param> public dinosaursChangedEventArgs(ChangeType change, string item, string replacement) { ChangeType = change; ChangedItem = item; ReplaceWith = replacement; } } /// <summary> /// 将类型的四种操作实现枚举,枚举定义后面需要增加分号 /// 因为是一个定义,而非方法或类 /// </summary> public enum ChangeType { Added, Removed, Replaced, Cleared }; }
java自用集合中使用泛型的练习(代码片段)
...!!!!!!!😐😐集合中使用泛型总结:①集合接口或集合类在jdk5.0时都修改为带泛型的结构。②在实例化集合类时,可以指明具体的泛型类型③指明完以后,在集合类或接口中... 查看详情
list集合优化,泛型的使用以及坼箱和装箱
1.listvector线程同步,线程安全arraylist的运行速度较快,因为没有使用线程LlinkedList以链表结构存储数据2.泛型泛型类泛型接口泛型方法泛型的属性泛型的属性属性的数据类型由调用方来决定当前属性数据类型integer是int数据类型的... 查看详情
集合泛型的使用
...的疏离,特别是其中事件触发地方。该例子是对通过基于集合的泛型类来构建一个自定义的类,并且基于四个方法,重写了其增删改查的操作。该例子是通过一个改变的改变的通知事件,在每一个方法的最后被触发。其中,Dinosa... 查看详情
泛型的泛型的好处
...,这是非泛型类和非泛型方法无法具备的。泛型通常用与集合以及作用于集合的方法一起使用。.NETFramework2.0版类库提供一个新的命名空间System.Collections.Generic,其中包含几个新的基于泛型的集合类。建议面向2.0版的所有应用程序... 查看详情
泛型的使用
泛型的使用泛型:1.没有使用泛型,任何Object子类都可以被添加2.数据类型强转可能会爆出异常publicclassTestGeneric//集合中没有使用泛型publicstaticvoidmain(String[]args)Listlist=newArrayList();list.add(1);list.add(2);list.add(3);list.ad 查看详情
java中泛型的使用
参考技术A泛型可以避免强制类型转换,设定集合对象中存储的对象类型。比如List<String>list=newArrayList<String>();那在这个list中,只能存储字符串对象。 参考技术B一般使用在集合上,比如现在将一个字符串类型放在集合里... 查看详情
通过反射了解集合泛型的本质
通过反射了解集合泛型的本质importjava.lang.reflect.Method;importjava.util.ArrayList;/***通过反射了解集合泛型的本质*@authorshm**/publicclassMethodDemo02{ publicstaticvoidmain(String[]args){ ArrayListlist=newArrayList(); list.a 查看详情
泛型的使用
泛型的好处: 1.把运行时出现的问题提前至了编译时。 2.避免了无谓的强制类型转换。 泛型在集合中的应用: ArrayList<String>list=newArrayList&l 查看详情
泛型的引入(代码片段)
JDK5.0新特性——泛型集合可以存储任何类型的对象,但是当把一个对象存入集合后,集合会"忘记"这个对象的类型,将该对象从集合中取出,这个对象的编译类型就变成了Object类型。为了解决这个问题,在Java中引入了"参数... 查看详情
java泛型的基本介绍和使用
现在开始深入学习java的泛型了,以前一直只是在集合中简单的使用泛型,根本就不明白泛型的原理和作用。泛型在java中,是一个十分重要的特性,所以要好好的研究下。一、泛型的基本概念 泛型的定义:泛型是JDK1.5的一项... 查看详情
java泛型的读写规则:pecs(代码片段)
...的重要用法。PECS就是当你需要遍历某一个类型和子类的集合数据时,集合相当于生产者,此时泛型使用<?extendsT>。当需要往某个类型的集合添加类和子类实例时,集合相当于消费者,此时泛型使用<?superT>... 查看详情
java泛型的读写规则:pecs(代码片段)
...的重要用法。PECS就是当你需要遍历某一个类型和子类的集合数据时,集合相当于生产者,此时泛型使用<?extendsT>。当需要往某个类型的集合添加类和子类实例时,集合相当于消费者,此时泛型使用<?superT>... 查看详情
java泛型的读写规则:pecs(代码片段)
...的重要用法。PECS就是当你需要遍历某一个类型和子类的集合数据时,集合相当于生产者,此时泛型使用<?extendsT>。当需要往某个类型的集合添加类和子类实例时,集合相当于消费者,此时泛型使用<?superT>... 查看详情
java中的泛型
... Tt:Type类型是否使用泛型的对比不使用泛型/***创建集合对象,不使用泛型*好处:*集合不使用泛型,默认的类型就是Object类型,可以存储任意类型的数据。*弊端:*不安全,会引发异常*/好处(举例):publicclassD 查看详情
java泛型(generics)的使用
...泛型是JDK1.5以后增加的,它可以帮助我们建立类型安全的集合。在使用了泛型的集合中,遍历时不必进行强制类型转换。JDK提供了支持泛型的编译器,将运行时的类型检查提前到了编译时执行,提高了代码可读性和安全性。 ... 查看详情
unity的c#学习——泛型的创建与继承泛型集合类泛型中的约束和反射(代码片段)
...2、泛型的创建与调用3、泛型类与非泛型类的继承4、泛型集合类5、泛型中约束与反射的应用5.1约束——限定可使用的数据类型5.2反射——获取要使用的数据类型泛型C#泛型是C#2.0中引入的一个非常重要的新功能。它允许开发人员... 查看详情
javase集合框架——泛型(代码片段)
目录一、为什么要有泛型二、在集合中使用泛型2.1集合使用泛型2.2Comparable类和Comparator比较器使用泛型 1)Comprable类使用泛型2)Comparator使用泛型三、自定义泛型(泛型类、泛型接口;泛型方法)3.1泛型类/泛型... 查看详情
java泛型简介定义和使用含有泛型的类定义和使用含有泛型的方法定义和使用含有泛型的接口泛型通配符?受限泛型(代码片段)
泛型简介:集合中存储数据的类型称之为泛型,泛型是一种未知的数据类型,当不知道使用什么数据类型的时候可以使用泛型;当创建对象时在指明数据类型并赋值给泛型即可;泛型也可以看做是一个变量ÿ... 查看详情