优点:增加类型安全,简化编码
常见的泛型有:泛型类和泛型方法
public class Stack {}
//T为占位符,表示一个通用数据类型,使用时用实际类型代替
//T可以很多个,以逗号隔开
private T[] stack; //泛型容器
public void Push(T item);
public T Pop(); //泛型方法
MyStack stack1 = new MyStack(5); //实例化泛型类
stack1.Push(1); //使用泛型类的泛型方法
泛型类在初始化时必须指明通用数据类型(不能假定类型),所以一般不允许无参构造函数。故使用default关键字
class MyClass
{
private T1 obj1;
private MyClass()
{
//obj1 = null; --无效
//obj1 = new T1(); --未指明通用参数类型,无法使用
obj1 = default(T1); //若T1为指定类型则赋值null;为值类型则赋值0;为结构类型则视具体成员类型而定(0或null)
}
}
使用where关键字标记在声明后、类体前。用于限定通用类型的种类。可以限定值类型、引用类型、基类类型、接口类型、含无参构造函数的引用类型。
class MyClass
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); //必须使用+=