委託具有以下特點:
1、委託類似於C/C++函數指針,但它是類型安全的。
2、委託允許將方法作爲參數進行傳遞。
3、委託可用於定義回調方法。
4、委託可以將多個方法關聯在一起。例如,可以對一個事件調用多個方法。
5、委託所指向的方法不需要與委託簽名精確匹配。
定義和使用委託:
1、聲明委託類型
2、實例化委託對象
3、調用委託方法
事件是類在發生其關注的事情時用來提供通知的一種方式。當發生與某個對象相關的事件時,該類會使用事件將這一對象通知給用戶。這種通知即爲引發事件,引發事件的對象稱爲事件源或者發行者。
接收時間的對象稱爲訂閱者,訂閱者之所以會接到通知,是因爲訂閱者訂閱了事件源的該事件
事件的創建與使用
1、在事件源類的聲明中爲事件創建一個委託類型和聲明事件
2、在訂閱者類中創建時間處理方法
3、訂閱事件
4、創建引發事件的方法
5、引發事件
例子:委託
namespace @delegate
{
delegate double mydelegate(double x, double y); //聲明委託類型
class MyDeClass //聲明含有方法的類
{
public double add(double x,double y)
{
return x + y;
}
public double sub(double x,double y)
{
return x + y;
}
}
class Program
{
static void Main(string[] args)
{
MyDeClass myDeClass = new MyDeClass();
mydelegate p = new mydelegate(myDeClass.add);//mydelegate p=myDeClass.add 委託對象關聯方法
Console.WriteLine("1+1={0}", p(1, 1));//調用委託對象
p = myDeClass.sub;
Console.WriteLine("2-1={0}", p(2, 1));
}
}
}
例子:事件
namespace @event
{
public class Teacher
{
private string name;
public delegate void delegateType();//聲明事件委託類型
public event delegateType ClassEvent;//聲明一個上課事件
public Teacher(string name)
{
this.name = name;
}
public void Start()//引發事件的方法
{
Console.WriteLine(name + "教師宣佈開始上課");
if (ClassEvent != null)
ClassEvent();//引發事件的語句
}
public class Student
{
private string sname;
public Student (string name)
{
this.sname = name;
}
public void Listener()
{
Console.WriteLine("學生" + sname + "正在認真聽課");
}
public void Record()
{
Console.WriteLine("學生" + sname + "正在做筆記");
}
}
class Program
{
static void main(string[] args)
{
Teacher t = new Teacher("李明");
Student s1 = new Student("小明");
Student s2 = new Student("大明");
t.ClassEvent += new Teacher.delegateType(s1.Listener);
t.ClassEvent += new Teacher.delegateType(s2.Record);
t.Start();//引發事件
}
}
}
}