Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 52 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
52
Dung lượng
507,48 KB
Nội dung
Delegate & Event
Nguyen Ha Giang
1Nguyen HaGiang -200909/09/2012
Table of Contents
§ Delegate
§ Definition of delegate
§ Working with delegates in C#
§ Multicast delegate
§ Problem & Solution for generic Sort method
§ Event
§ What is event
§ Event & delegate
§ Publishing & subscribing
§ Demo using event
§ Summary
2Nguyen HaGiang -2009
09/09/2012
Definition of delegate
• Class package some signature methods
• Using in event-handling model of C#
• Like C/C++ method pointers, but more
specific
– Type safe
– Object-oriented mechanism
• Delegates are classes
– Can create instances of delegates
– Delegates can refer one or more methods
3Nguyen HaGiang -2009
09/09/2012
Definition of delegate
• Delegates define a method signature
– Return type
– Sequence of parameter types
• Any method has same signature can add to
instance of delegate
• Delegate instances have the list of method
references
– Using “
+=” for adding method to instance
– Using “
-=” for removing method out of instance
4Nguyen HaGiang -2009
09/09/2012
Working with delegates
• Define a delegate in namespace or class
5Nguyen HaGiang -2009
09/09/2012
public delegate void MyDelegate1(intx, inty);
Delegate for methods: void ABC( int, int )
public delegate string MyDelegate2(float f);
Delegate for methods: string XYZ( float )
Working with delegates
• Instance of delegate
6Nguyen HaGiang -2009
09/09/2012
class Test
{
public void Method1(inta, intb)
{
// body of method
}
…
}
Test t = new Test();
MyDelegate1 d1 = new MyDelegate1( t.Method1);
public delegate void MyDelegate1(intx, inty);
Working with delegate
• Instance of delegate
7Nguyen HaGiang -2009
09/09/2012
class Test
{
…
public static string Method2(float f)
{
// body of method
}
}
MyDelegate2 d2 = new MyDelegate2( Test.Method2);
public delegate string MyDelegate2(float f);
Working with delegate
• Invoking delegates
8Nguyen HaGiang -2009
09/09/2012
intx = 5, y = 10;
d1(x, y);
d1(10, 20); inty = 2;
d1(100, y);
d1
float f =0.5f;
string s = d2(f);
string s = d2(100);
d2
Invoking multiple delegate
• Using only for delegates with no return value
9Nguyen HaGiang -2009
09/09/2012
class Test
{
public delegate voidMyDelegate3(intn1, intn2);
static void Print(intx, inty)
{
Console.WriteLine("x={0}, y={1}", x, y);
}
static void Sum(inta, intb)
{
Console.WriteLine("Tong={0}", a + b);
}
// (cont)…
}
No return
Invoking multiple delegate
10Nguyen HaGiang -2009
09/09/2012
class Test
{
//…
static void Main(string[] args)
{
MyDelegate3 md= new MyDelegate3(Print);
md +=new MyDelegate3(Sum);
md(5, 10);
md -= new MyDelegate3(Print);
md(50, 60);
}
}
x=5, y=10
Tong=15
Tong=110
[...]... SecondChangeHandler(object clock, EventArgs info); Đối tượng phát sinh event Tham số kiểu EventArgs 09/09/2012 NguyenHaGiang- 2009 29 Minh h a • Khai báo event có hàm xử lý mô tả trên Kiểu delegateevent SecondChangeHandler OnSecondChange; Tên của event Từ khóa event: thể hiện cơ chế publishing & subscribing 09/09/2012 NguyenHaGiang- 2009 30 Minh h a • Kích hoạt sự kiện Kiểm tra xem có hàm xử lý được đăng ký hay không?... 09/09/2012 NguyenHaGiang- 2009 27 Minh h a • Tạo một lớp Clock: – Khai báo một event: OnSecondChange – Một phương thức Run: cứ 1s thì phát sinh sự kiện OnSecondChange • Tạo 2 lớp: AnalogClock và DigitalClock nhận xử lý sự kiện OnSecondChange của lớp Clock 09/09/2012 NguyenHaGiang- 2009 28 Minh h a • Khai báo delegate xử lý event Tên delegate xử lý sự kiện delegate void SecondChangeHandler(object... kiện (event handler) 09/09/2012 NguyenHaGiang- 2009 24 Event&Delegate • Trình xử lý sự kiện trong NET Framework được mô tả như sau: – Trả về giá trị void – Tham số 1: nguồn phát sinh sự kiện, đây chính là đối tượng publisher – Tham số 2: là đối tượng thuộc lớp dẫn xuất từ EventArgs • Phải thực hiện trình xử lý sự kiện theo đúng mẫu trên! 09/09/2012 NguyenHaGiang- 2009 25 Event&Delegate • Khai... Person(“Ngoc Thao", 47, 1979); persons[3] = new Person( Ha Nam", 4, 2009); // create instance of delegate refer to Person.CompareName CompareObj cmp = new CompareObj(Person.CompareName); HaGLib.Sort( persons, cmp ); Class contains static Sort method 09/09/2012 NguyenHaGiang- 2009 18 09/09/2012 NguyenHaGiang- 2009 19 09/09/2012 NguyenHaGiang- 2009 20 Event • Cơ chế thông điệp giữa các lớp hay các... (OnSecondChange != null) OnSecondChange(this, new EventArgs()); Gọi hàm xử lý sự kiện đã đăng ký 09/09/2012 NguyenHaGiang- 2009 31 Minh h a public class Clock { public delegate void SecondChangeHandler(object clock, EventArgs info); public event SecondChangeHandler OnSecondChange; public void Run() { while (true) { Thread.Sleep(1000); if (OnSecondChange != null) OnSecondChange(this, new EventArgs());... mẫu trên! 09/09/2012 NguyenHaGiang- 2009 25 Event&Delegate • Khai báo delegate xử lý sự kiện public delegate void HandlerName(object obj, EventArgs arg); • Khai báo event public event HandlerName OnEventName; • Các lớp muốn xử lý khi sự kiện OnEventName phát sinh thì phải thực thi event handler 09/09/2012 NguyenHaGiang- 2009 26 Minh h a • Xây dựng 1 lớp thực hiện yêu cầu: “cứ mỗi giây sẽ phát... passed NguyenHaGiang- 2009 15 Solution Delegate will refer to compare method of class Definition of Sort method public static void Sort(object[] objs, CompareObj cmp) { for(int i=0; i < objs.Length-1; i++) for(int j=objs.Length-1; j>i; j ) if ( cmp( objs[j], objs[j-1] ) == -1 ) Swap( objs[j], objs[j-1] ); Invoking delegate (refer Compare method of class) } 09/09/2012 NguyenHaGiang- 2009 16 Solution...09/09/2012 NguyenHaGiang- 2009 11 Problem How to build the Sort method for array of objects of any data type? 09/09/2012 NguyenHaGiang- 2009 12 Problem • Survey – The objects are (primitive) data type such as: long, int, float, string…so easy to do! – In other case, object is complex data type, how to do? Which criteria for comparing? 09/09/2012 NguyenHaGiang- 2009 13 Solution • Objects have to... void Subscribe(Clock theClock) { theClock.OnSecondChange += new Clock.SecondChangeHandler(Show); } Ủy thác phương thức Show cho OnSecondChange 09/09/2012 NguyenHaGiang- 2009 35 Minh h a public class DigitalClock { public void Subscribe(Clock theClock) { theClock.OnSecondChange += new Clock.SecondChangeHandler(Show); } public void Show(object obj, EventArgs args) { DateTime date = DateTime.Now; Console.WriteLine("Digital... Using delegate to pass “compare method” into Sort method void Sort(object[] list, CompareObj cmp) This delegate refers to Compare method of class which need to sort 09/09/2012 NguyenHaGiang- 2009 14 Solution • Define delegate CompareObj for Sort method Name of delegate type public delegate int CompareObj(object o1, object o2) -1 : 0 : 1 : 09/09/2012 o1 “” o2 Two objects passed Nguyen . Delegate & Event Nguyen Ha Giang 1Nguyen Ha Giang -2 00909/09/2012 Table of Contents § Delegate § Definition of delegate § Working with delegates in C# § Multicast delegate § Problem &. generic Sort method § Event § What is event § Event & delegate § Publishing & subscribing § Demo using event § Summary 2Nguyen Ha Giang -2 009 09/09/2012 Definition of delegate • Class package. Ha Giang -2 009 09/09/2012 public delegate int CompareObj(object o1, object o2) -1 : o1 “<“ o2 0 : o1 “=“ o2 1 : o1 “>” o2 Two objects passed Name of delegate type Solution 1 6Nguyen Ha Giang