优点:增加类型安全,简化编码
常见的泛型有:泛型类和泛型方法
- public class Stack<T> {}
- //T为占位符,表示一个通用数据类型,使用时用实际类型代替
- //T可以很多个,以逗号隔开
- private T[] stack; //泛型容器
-
- public void Push(T item);
- public T Pop(); //泛型方法
- MyStack<int> stack1 = new MyStack<int>(5); //实例化泛型类
-
- stack1.Push(1); //使用泛型类的泛型方法
泛型类在初始化时必须指明通用数据类型(不能假定类型),所以一般不允许无参构造函数。故使用default关键字
- class MyClass <T1,T2>
- {
- private T1 obj1;
-
- private MyClass()
- {
- //obj1 = null; --无效
- //obj1 = new T1(); --未指明通用参数类型,无法使用
-
- obj1 = default(T1); //若T1为指定类型则赋值null;为值类型则赋值0;为结构类型则视具体成员类型而定(0或null)
- }
- }
使用where关键字标记在声明后、类体前。用于限定通用类型的种类。可以限定值类型、引用类型、基类类型、接口类型、含无参构造函数的引用类型。
- class MyClass <T1,T2,T3>
- where T1:struct //类型必须为值类型
- where T2:class //必须为值类型
- where T3:new() //必须有一个无参数构造方法,必须放在最后
- {
-
- }
委托是一种全新的面相对象语言特性,运行在.Net平台;基于委托,开发事件驱动将会变得相当方便;委托可以视为一种数据类型,可以定义变量,但其是一种特殊的变量。
委托定义的变量仅能接收方法(可以理解委托是方法指针)
委托的映射关系
- //声明委托(定义一个方法原型)需要声明返回值+参数类型和个数
- public delegate int CalculatorDelegate(int a,int b);
-
- //根据委托定义一个具体方法
- static int Add(int a,int b)
- { return a+b; }
-
- //调用委托(需要先创建委托对象)--可以在另一个类中
- CalculatorDelgate objCal = new CalculatorDelgate (Add);
-
- int reslut = objCal(10,20);
-
- //委托的动态调度(非首次时候使用)
- objCal -= Add; //断开委托关联
- objCal += Sub; //关联委托关联
- //主窗体代码
-
- //1-声明委托
- public delegate void ShowCounter(string counter);
-
- //2-实现原型
- private void Receiver(string counter)
- {
- this.lblCounter.Text = counter;
- }
-
- //3-将子窗体委托变量与主窗体关联
- FrmOther objFrm = new FrmOther();
- objFrm.msgSender = this.Receiver;
- objFrm.Show();
- //从窗体代码
-
- //创建委托对象
- public ShowCounter msgSender;
-
- //调用
- counter++;
- if(msgSender !=null)
- {
- msgSender(counter.ToString());
- }
- //主窗体代码
-
- //1-声明委托
- public delegate void ShowCounter(string counter);
-
- //2-创建委托对象
- public ShowCounter msgSender;
-
- //3-实例化子窗体并关联委托
- FrmOther objFrm1 = new FrmOther();
- FrmOther objFrm2 = new FrmOther();
-
- this.msgSender += objFrm1.Receiver();
- this.msgSender += objFrm1.Receiver();
-
- //4-使用Invoke传值
- this.msgSender.Invoke(counter.ToString()); //所有关联了的委托都可以收到
- //从窗体代码
-
- //1-根据委托创建方法(接收委托传递的信息)
- private void Receiver(string counter)
- {
- this.lblCounter.Text = counter;
- }
事件有两个参与者:发送者(sender),即对象本身,当对象本身状态发生变化时触发事件,并通知接受者。
接受者(reciver),用来处理时间,在发送者触发一个事件后悔自动执行的内容。
- //发送者代码
-
- //1-创建委托
- public delegate void delegateSendMsg(string msg);
-
- //2-定义一个事件
- public event delegateSendMsg SendMsgEvent;
-
- //3-激发事件
- SendMsgEvent(txtMsg.Text);
-
- //4-关联接受者和事件
- FrmClient objClient = new FrmClient();
- SendMsgEvent += new delegateSendMsg(objClient.EventResponse);
- //接受者代码
-
- public void EventResponse(string msg)
- {
- this.txtMsg.text=msg;
- }
- //从窗体事件关联到主窗体
- FrmClient objCli = new FrmClient();
- objCli.SendMsgEvent += new delegateSendMsg(this.ShowMsg_SendMsgEvent);
事件对象本质是一个私有的委托对象,都有Add和Remove
委托对象私有化之后不能直接赋值
- objCli.SendMsgEvent = null; //无法编译,不能直接赋值
- objCli.SendMsgEvent += new delegateSendMsg(this.ShowMsg_SendMsgEvent); //必须使用+=