• Sử dụng:
<đối tượng=""> new ;
• Ủy quyền được dùng để:
Xác định những loại phương thức có thể được dùng để xử lý các sự kiện
Thực hiện callback trong chương trình ứng dụng.
Xác định các phương thức tĩnh và các instance của phương thức không biết
trước cho đến khi chương trình thực hiện.
• Các phương thức được gọi lại thông qua Delegate có thể là:
Một instance method.
Một class method.đối>
28 trang |
Chia sẻ: thanhle95 | Lượt xem: 630 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Bài giảng Ngôn ngữ C# - Bài 7: Ủy nhiệm, sự kiện và xử lý ngoại lệ trong C# - Chử Đức Hoàng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
1
v1.0011106203
BÀI 7
ỦY NHIỆM, SỰ KIỆN VÀ XỬ LÝ
NGOẠI LỆ TRONG C#
GV. Chử Đức Hoàng
2
v1.0011106203
TÌNH HUỐNG DẪN NHẬP
Ngôn ngữ lập trình C# thực hiện việc uỷ nhiệm, xử lý sự kiện và xử lý các ngoại lệ như thế nào?
Chương trình được xây dựng một nhiệm vụ lớn như chương trình quản lý học viên của
trường đại học Quốc Gia thì cần đến rất nhiều các kỹ thuật tinh vi của ngôn ngữ lập
trình. Các ký thuật này không những giúp cho người viết phần mềm dễ dàng thực hiện
các công việc mà còn tổ chức và xử lý các lỗi cho chương trình để chương trình chạy
ổn định.
3
v1.0011106203
MỤC TIÊU
Trình bày khái niệm, cách thức sử dụng ủy nhiệm trong C#.
Trình bày khái niệm về ngoại lệ, và bắt lỗi, xử lý lỗi trong C#.
Trình bày khái niệm sự kiện, và thực hiện chương trình qua các sự kiện
trong C#.
Xây dựng chương trình sử dụng ủy nhiệm, sự kiện và bắt lỗi.
4
v1.0011106203
NỘI DUNG
1.1. Uỷ nhiệm1
1.2. Các phương thức dấu tên2
1.3. Sự kiện3
1.4. Xử lý ngoại lệ4
5
v1.0011106203
Khai báo
• Uỷ nhiệm(delegate): là kiểu dữ liệu tham chiếu được dùng để đóng gói một phương
thức với tham số và kiểu trả về xác định.
• Trong delegate thì không cần quan tâm đến những lớp đối tượng mà nó tham chiếu
tới mà chỉ cần quan tâm đến các tham số của phương thức và kiểu trả về phải phù
hợp với đối tượng ủy quyền khai báo.
• Khai báo:
delegate ;
1.1. ỦY NHIỆM - DELEGATE
6
v1.0011106203
• Lớp đóng gói các phương thức (method signature)
• Dùng trong xử lý sự kiện của C#
• Đặc tính
An toàn kiểu (typesafe).
Bảo mật.
Hướng đối tượng.
• Tất cả các phương thức đóng gói có cùng kiểu trả về và dạng tham số thì có thể
được truyền vào thể hiện của delegate.
1.1.1. ĐẶC ĐIỂM CỦA DELEGATE
7
v1.0011106203
• Sử dụng:
new ;
• Ủy quyền được dùng để:
Xác định những loại phương thức có thể được dùng để xử lý các sự kiện
Thực hiện callback trong chương trình ứng dụng.
Xác định các phương thức tĩnh và các instance của phương thức không biết
trước cho đến khi chương trình thực hiện.
• Các phương thức được gọi lại thông qua Delegate có thể là:
Một instance method.
Một class method.
1.1.1. ĐẶC ĐIỂM CỦA DELEGATE (tiếp theo)
8
v1.0011106203
• public delegate void MyDelegate1(int x, int y)
• public delegate string MyDelegate2(float f)
• public void Method1(int x, int y)
• {
•
• }
•
• MyDelegate1 del1 = new MyDelegate1(Method1);
• public string Method2(float f)
• {
•
• }
•
Ví dụ:
1.1.1. ĐẶC ĐIỂM CỦA DELEGATE (tiếp theo)
9
v1.0011106203
• Gọi delegate
int x = 5, y = 10;
del1(x, y); del1(10, 20);
int y = 2;
del1(100, y);
Gọi del1
float f =0.5f;
string s;
s = del2(f);
string s = del2(100f);
Gọi del2
1.1.1. ĐẶC ĐIỂM CỦA DELEGATE (tiếp theo)
10
v1.0011106203
• Khi một delegate gói nhiều hơn một phương thức thì nó được gọi là
multicast delegate.
• Một multicast delegate được gọi thì nó sẽ gọi liên tiếp các phương thức theo thứ tự.
• Một delegate có kiểu trả về là void thì trình biên dịch sẽ coi như đây là một
multicast delegate.
• Một multiccast delegate cho phép nhận toán tử “+”, “-”, “+= “, “-=“.
• Một muticast delegate là một lớp được dẫn xuất từ lớp System.MulticastDelegate.
1.2. MULTICAST DELEGATE
Ví dụ multicast delegate
15. void Print(int x,int y) {
16. }
17. Console.WriteLine(“x = {0}, y = {1}”, x, y);
18. void Sum(int x, int y) {
19. Console.WriteLine(“Tong = {0}”, x+y);
20. }
21. MyDelegate1 mulDel = new MyDelegate1(Print);
22. mulDel += new MyDelegate1(Sum);
23. mulDel(5, 10);
24. mulDel -= new MyDelegate1(Print);
25. mulDel(5,10);
11
v1.0011106203
• Sự kiện là một hành động nào đó sảy ra và không thể tiên đoán trước trình tự mà sự
kiện phát sinh
• Khi một sự kiện sảy ra thì lớp phát sinh sự kiện (publish) sẽ phát ra thông điệp sự
kiện cho lớp khác biết. Các lớp khác sẽ bắt thông điệp sự kiện và xử lý sự kiện.
• Lớp phát sinh sự kiện không quan tâm đến việc xử lý sự kiện như thế nào.
• Sự kiện thể hiện sự truyền thông qua lại giữa các lớp phát sinh sự kiện và xử lý
sự kiện.
1.3. SỰ KIỆN - EVENT
12
v1.0011106203
Cơ chế publishing và subscribing
Sự kiện được thực hiện nhờ delegate, trong đó:
• Lớp Publish định nghĩa uỷ thác
• Lớp Subscrib phải thực thi.
• Khi có sự kiện sảy ra thì các phương thức lớp subcribing được gọi thông qua uỷ thác.
A
B
C
event
publish
subscribeThông báo
Đăng ký
1.3. SỰ KIỆN – EVENT (tiếp theo)
13
v1.0011106203
Trình xử lý sự kiện
• Phương thức để xử lý sự kiện gọi là trình xử lý sự kiện (event handler). Hay event
handler.
• Trình xử lý sự kiện trong .NET Framework được thực hiện theo mẫu 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
1.3. SỰ KIỆN – EVENT (tiếp theo)
14
v1.0011106203
Khai báo
• 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
• Từ khóa event điều khiển cách mà thuộc tính sự kiện được truy cập bởi các lớp
subscriber. Từ khóa event được thiết kế để duy trì cho cách thể hiện
publish/subscribe.
1.3. SỰ KIỆN – EVENT (tiếp theo)
15
v1.0011106203
• Lớp EventArgs
• EventArgs là lớp cơ sở cho tất cả các dữ liệu về sự kiện.
• Lớp EventArgs thừa kế tất cả các phương thức từ lớp Object và thêm vào một
trường public static empty thể hiện một sự kiện không có trạng thái (sử dụng
cho những sự kiện không trạng thái).
• Lớp dẫn xuất từ EventArgs chứa những thông tin về sự kiện.
• Sự kiện là thuộc tính của lớp phát ra sự kiện.
• Ví dụ:
• Xây dựng một lớp thực hiện yêu cầu: “cứ mỗi giây sẽ phát sinh một sự kiện”.
• Cho phép lớp đồng hồ số hiển thị thời gian đăng ký xử lý sự kiện trên.
• Giải quyết:
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 lớp: DigitalClock nhận xử lý sự kiện OnSecondChange của lớp Clock.
1.3. SỰ KIỆN – EVENT (tiếp theo)
16
v1.0011106203
Lớp DigitalClock
• Định nghĩa trình xử lý sự kiện của Clock
Đúng mô tả delegate hàm xử lý của lớp Clock.
Thực hiện một số thao tác riêng của DigitalClock.
• Đăng ký xử lý với trình xử lý sự kiện trên khi có sự kiện OnSecondChange của Clock
Chức năng đăng ký với lớp Clock là có xử lý khi sự kiện OnSencondChange của
Clock phát sinh.
Ủy thác cho lớp Clock sẽ gọi trình xử lý định nghĩa bên trên của DigitalClock.
1.3. SỰ KIỆN – EVENT (tiếp theo)
17
v1.0011106203
Trình xử lý của DigitalClock
public void Show(object obj, EventArgs args)
{
DateTime date = DateTime.Now;
Console.WriteLine("Digital Clock: {0}:{1}:{2}",
date.Hour, date.Minute, date.Second);
}
Tên của trình xử lý Đối tượng phát sinh sự kiện
1.3. SỰ KIỆN – EVENT (tiếp theo)
18
v1.0011106203
Đăng ký xử lý sự kiện
public void Subscribe(Clock theClock)
{
theClock.OnSecondChange +=
new Clock.SecondChangeHandler(Show);
}
Đối tượng này sẽ
phát sinh sự kiện
Ủy thác phương thức Show cho
OnSecondChange
1.3. SỰ KIỆN – EVENT (tiếp theo)
19
v1.0011106203
40. public class DigitalClock
41. {
42. public void Subscribe(Clock theClock)
43. {
44. theClock.OnSecondChange +=
new Clock.SecondChangeHandler(Show);
45. }
46. public void Show(object obj, EventArgs args)
47. {
48. DateTime date = DateTime.Now;
49. Console.WriteLine("Digital Clock: {0}:{1}:{2}",
date.Hour, date.Minute, date.Second);
50. }
51. }
Tạo lớp DigitalClock
1.3. SỰ KIỆN – EVENT (tiếp theo)
20
v1.0011106203
• Một ngoại lệ (exception) là một đối tượng đóng gói những thông tin về sự cố bất
thường của một chương trình.
• Ngoại lệ xảy ra do:
Các lỗi về lập trình do lập trình viên không kiểm soát tốt mã nguồn (gọi là bug)
và phát sinh ra ngoại lệ. Ngoại lệ không thể sửa các bug mà nên viết lại
mã nguồn.
Lỗi gây ra bởi người dùng (error) phát sinh ngoại lệ, phải bắt ngoại lệ này và
yêu cầu người dùng thực hiện đúng.
Tài nguyên không đủ, truy cập tập tin không tồn tại, và phát sinh ngoại lệ. Có
thể không xử lý được nhưng phải bắt được những ngoại lệ này và quản lý chúng
để chúng không làm hỏng hoặc treo ứng dụng.
1.4. XỬ LÝ NGOẠI LỆ
21
v1.0011106203
Phát sinh ngoại lệ
• Cú pháp để tạo một ngoại lệ:
throw new System.Exception();
• Khi phát sinh ngoại lệ thì chương trình dừng ngay tức khắc.
• CLR tìm kiếm một trình xử lý ngoại lệ trong phương thức hiện thời.
• Nếu trong phương thức hiện thời không có thì CLR tiếp tục tìm trong phương thức
gọi phương thức hiện thời. Quá trình tìm ngược được thực hiện đến khi nào tìm thấy
và cuối cùng là phương thức Main() mà vẫn không tìm thấy bất cứ trình xử lý ngoại
lệ nào CLR sẽ gọi trình xử lý ngoại lệ mặc định để xuất ra một thông điệp lỗi đồng
thời kết thúc chương trình.
1.4. XỬ LÝ NGOẠI LỆ (tiếp theo)
22
v1.0011106203
Cấu trúc để đón bắt và xử lý ngoại lệ
Try
{
//Phần chương trình có thể gây lỗi
}
catch (Exception1 )
{
// Xử lý lỗi 1
}
catch (Exception2 )
{
// Xử lý lỗi 2
}
.
Finally
{
//Dọn dẹp, tránh trùng lặp đoạn mã
lệnh //trong hai khối “Try” và “catch”
}
1.4. XỬ LÝ NGOẠI LỆ (tiếp theo)
23
v1.0011106203
Các lớp ngoại lệ
Các ngoại lệ được tổ chức thành dạng cây kế thừa:
• Lớp ngoại lệ gốc Exception.
• Các ngoại lệ hệ thống(SystemException): Kết thúc chương trình khi có ngoại lệ.
• Các ngoại lệ do người dùng định nghĩa(ApplicationException): không làm kết thúc
chương trình.
1.4. XỬ LÝ NGOẠI LỆ (tiếp theo)
24
v1.0011106203
52. void Process(int index)
53. {
54. FileStream data = null;
55. try
56. {
57. int[] data1 = new int[10];
58. data1[index] = 17;
59. data = new
FileStream("File.dat",
FileMode.Create);
60. data.WriteByte(0x10);
61. }
62. catch
(OutOfMemoryException e)
63. {
64. ...
65. }
66. catch
(IndexOutOfRangeExceptio
n e)
67. {
68. string msg = e.Message;
69. string trace =
e.StackTrace;
70. }
71. finally
72. {
73. data.Close();
74. }
75. }
1.4. XỬ LÝ NGOẠI LỆ (tiếp theo)
Ví dụ
25
v1.0011106203
77. class BadAccountException : ApplicationException
78. {
79. public int id;
80. public BadAccountException(string msg, int id)
81. :base(msg)
82. {
83. this.id = id;
84. }
85. }
86. class Bank
87. {
88. public void Withdraw(int id, double amount)
89. {
90. if (!accounts.Contains(id))
91. {
92. throw new BadAccountException("Invalid
account", id);
93. }
94. ...
95. }
96. ...
97. }
98. void Save(Bank b)
99. {
100. try
101. {
102. b.Withdraw(1234, 1000);
103. }
104. catch (BadAccountException e)
105. {
106. int i = e.id;
107. string s = e.Message;
108. }
109. }
1.4. XỬ LÝ NGOẠI LỆ (tiếp theo)
Ví dụ
26
v1.0011106203
TÓM LƯỢC CUỐI BÀI
• Nắm được khái niệm cơ bản về delegate:
delegate là gì, khai báo và sử dụng như thế nào.
Multicast delegate là gì, khi nào thì dùng multicast.
Viết chương trình có sử dụng delegate.
• Nắm được khái niệm cơ bản về sự kiện:
Sự kiện là gì? Cơ chế phát sinh và xử lý sự kiện trong C#?
Sử dụng delegate trong xử lý sự kiện như thế nào.
Viết chương trình xử lý sự kiện.
• Nắm được những khái niệm cơ bản về ngoại lệ:
Ngoại lệ, cơ chế phát sinh ngoại lệ.
Cách đón bắt và xử lý ngoại lệ trong C#.
Viết chương trình phát sinh và xử lý ngoại lệ.
PROPERTIES
Allow user to leave interaction: Anytime
Show ‘Next Slide’ Button: Don't show
Completion Button Label: Next Slide
PROPERTIES
Allow user to leave interaction: Anytime
Show ‘Next Slide’ Button: Don't show
Completion Button Label: Next Slide