一、委托的概念
1.委托从字面上理解就是一种代理,类似于房屋中介,由租房人委托中介为其租赁房屋。
在 C# 语言中,委托则委托某个方法来实现具体的功能。
2.委托的特点:委托是一种引用类型;委托是一种用户自定义类型;委托是方法的抽象;调用委托的时候,委托包含的所有方法将被执行。
3. 委托的分类:方法委托、多播委托、匿名委托
4.(1)定义声明委托(2)实例化委托(3)调用委托
- 方法委托
方法委托是最常用的一种委托,其定义的语法形式如下:
修饰符 delegate 返回值类型 委托名 ( 参数列表 );
- 定义声明委托
从上面的定义可以看出,委托的定义与方法的定义是相似的。
例如定义一个不带参数的委托
代码如下:
public delegate void MyDelegate();
- 实例化委托
在定义好委托后就到了实例化委托的步骤,命名方法委托在实例化委托时必须带入方法的具体名称。
实例化委托的语法形式如下:
委托名 委托对象名 = new 委托名 ( 方法名 );
委托中传递的方法名既可以是静态方法的名称,也可以是实例方法的名称。
需要注意的是,在委托中所写的方法名必须与委托定义时的返回值类型和参数列表相同。
- 调用委托
在实例化委托后即可调用委托,语法形式如下:
委托对象名 ( 参数列表 );
在这里,参数列表中传递的参数与委托定义的参数列表相同即可。
举例如下:
在Student类中新增成员方法:
//Student.cs
public void ShowInfo(string info)
{
Console.WriteLine("{0}:\n{1}", info,this.ToString());
}
修改Program类
class Program
{
//定义了一个委托,他指向的方法的特点:返回值为空,参数列表为空
public delegate void TestDelegate(string info);
static void Main(string[] args)
{
Student stu = new Student(1, "张三", 18);
//创建委托,stu对象的ShowInfo方法交由委托testDel 去执行。
TestDelegate testDel = new TestDelegate(stu.ShowInfo);
//调用委托
testDel("委托测试");
}
}
- 多播委托
在 C# 语言中多播委托是指在一个委托中注册多个方法,在注册方法时可以在委托中使用加号运算符或者减号运算符来实现添加或撤销方法。
举例如下:
新增两个学生类,并将其ShowInfo方法委托给testDel。
修改Program类:
class Program
{
//1、定义委托
public delegate void TestDelegate(string info);
static void Main(string[] args)
{
Student stu = new Student(1, "张三", 18);
Student stu1 = new Student(2, "李四", 20);
Student stu2 = new Student(3, "王五", 28);
//ShowInfo方法绑定到testDel委托对象
TestDelegate testDel = new TestDelegate(stu.ShowInfo);
//多播委托(一个委托对象绑定了多个方法)
testDel += stu1.ShowInfo;
testDel += stu2.ShowInfo;
//调用委托
testDel("委托测试");
}
}
- 匿名委托
在 C# 语言中匿名委托是指使用匿名方法注册在委托上,实际上是在委托中通过定义代码块来实现委托的作用。
class Program
{
//1、定义委托
public delegate void TestDelegate(string info);
static void Main(string[] args)
{
Student stu = new Student(1, "张三", 18);
Student stu1 = new Student(2, "李四", 20);
Student stu2 = new Student(3, "王五", 28);
//ShowInfo方法绑定到testDel委托对象
TestDelegate testDel = new TestDelegate(stu.ShowInfo);
//匿名委托
testDel +=delegate()
{
Console.WriteLine(“我是一个匿名委托”);
};
//调用委托
testDel("委托测试");
- 事件
事件是一种引用类型,实际上也是一种特殊的委托,事件要与委托一起使用。
举例如下:
Class Teacher:Person
{
//自我介绍动作
//创建委托类型
Public delegate void ShowMe(string commond);
//创建事件 事件是委托的对象
//ShowMeEevent 事件对象
Public event ShowMe ShowMeEevent;
}
Public Teacher(string name,int age, string.sex,string coures):base
{
this.coures=coures;
}
Public void AddStudent(Student stu)
If(stuList==null)
{
stuList=new List<Student>();
}
stuList.Add(stu);
//将学生的操作和老师的事件绑定(绑定操作)
classTeacher.ShowMeEevent+=stu.PrrintStudentInfo();
}
事件委托对象和一般委托对象的区别
事件委托对象只能在当前类的内部被调用
一般委托对象在任意地方通过对象进行调用
六、C#中的定时器
C#中定时功能一般使用定时器Timer类,Timer类需要引用命名空间using System.Timers。
Static void TimerFunc()
{
//间隔1s
Timer tiemr=new Timer(1000);
Tiemr.Elapsed+=Tiemr_Elapsed;
//启动定时器
//Tiemr.Start();
Tiemr.Enabled=true;
}
Private static void Tiemr_Elapsed(dbject sender,ElapsedEventArgs e)
{
Console.WriteLine(sender);
Console.WriteLine(e.SignalTime);
}