C#之泛型、委托、事件及其使用

一、泛型

        1.泛型的概念

                优点:增加类型安全,简化编码

                常见的泛型有:泛型类泛型方法

        2.定义泛型类

public class Stack {}
//T为占位符,表示一个通用数据类型,使用时用实际类型代替
//T可以很多个,以逗号隔开

        3.定义泛型成员和泛型方法

private T[] stack;    //泛型容器

public void Push(T item);
public T Pop();    //泛型方法

        4.泛型调用

MyStack stack1 = new MyStack(5);    //实例化泛型类

stack1.Push(1);    //使用泛型类的泛型方法

        5.default关键字

                泛型类在初始化时必须指明通用数据类型(不能假定类型),所以一般不允许无参构造函数。故使用default关键字

class MyClass 
{
    private T1 obj1;

    private MyClass()
    {
        //obj1 = null;    --无效
        //obj1 = new T1();    --未指明通用参数类型,无法使用

        obj1 = default(T1);    //若T1为指定类型则赋值null;为值类型则赋值0;为结构类型则视具体成员类型而定(0或null)
    }
}

        6.泛型约束

                使用where关键字标记在声明后、类体前。用于限定通用类型的种类。可以限定值类型、引用类型、基类类型、接口类型、含无参构造函数的引用类型

class MyClass 
    where T1:struct    //类型必须为值类型
    where T2:class    //必须为值类型
    where T3:new()    //必须有一个无参数构造方法,必须放在最后
{

}

二、委托

        1.委托的概述

                委托是一种全新的面相对象语言特性,运行在.Net平台;基于委托,开发事件驱动将会变得相当方便;委托可以视为一种数据类型,可以定义变量,但其是一种特殊的变量。

                委托定义的变量仅能接收方法(可以理解委托是方法指针

                委托的映射关系

C#之泛型、委托、事件及其使用_第1张图片

         2.委托的定义和使用

//声明委托(定义一个方法原型)需要声明返回值+参数类型和个数
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;    //关联委托关联

        3.利用委托实现跨窗体通信

C#之泛型、委托、事件及其使用_第2张图片

//主窗体代码

//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());
}

        4.利用委托实现主窗体向子窗体的广播

C#之泛型、委托、事件及其使用_第3张图片

//主窗体代码

//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;
}

三、事件

        1.事件的概述

                事件有两个参与者:发送者(sender),即对象本身,当对象本身状态发生变化时触发事件,并通知接受者。

                                                 接受者(reciver),用来处理时间,在发送者触发一个事件后悔自动执行的内容。

        2.事件的定义及应用

//发送者代码

//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);

四、委托和事件的对比

        1.相同点

                事件对象本质是一个私有的委托对象,都有Add和Remove

        2.不同点

                委托对象私有化之后不能直接赋值

objCli.SendMsgEvent = null;    //无法编译,不能直接赋值
objCli.SendMsgEvent += new delegateSendMsg(this.ShowMsg_SendMsgEvent);    //必须使用+=

你可能感兴趣的:(微软相关,学习笔记,c#,开发语言)