BÀI 7 ỦY NHIỆM, SỰ KIỆN VÀ XỬ LÝ NGOẠI LỆ TRONG C#
GV. Chử Đức Hoàng
1
v1.0011106203
TÌNH HUỐNG DẪN NHẬP
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.
các ngoại lệ như thế nào?
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ý
2
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 sự kiện, và thực hiện chương trình qua các sự kiện 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#.
3
v1.0011106203
Xây dựng chương trình sử dụng ủy nhiệm, sự kiện và bắt lỗi.
NỘI DUNG
1
1.1. Uỷ nhiệm
2
3
1.2. Các phương thức dấu tên
4
1.3. Sự kiện
4
v1.0011106203
1.4. Xử lý ngoại lệ
1.1. ỦY NHIỆM - DELEGATE
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:
5
v1.0011106203
delegate
1.1.1. ĐẶC ĐIỂM CỦA DELEGATE
• 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ể
6
v1.0011106203
được truyền vào thể hiện của delegate.
1.1.1. ĐẶC ĐIỂM CỦA DELEGATE (tiếp theo)
• 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.
7
v1.0011106203
Một class method.
1.1.1. ĐẶC ĐIỂM CỦA DELEGATE (tiếp theo)
Ví dụ:
• 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)
• {
• …
8
v1.0011106203
• }
• …
1.1.1. ĐẶC ĐIỂM CỦA DELEGATE (tiếp theo)
• Gọi delegate
Gọi del1
int x = 5, y = 10; del1(x, y); int y = 2; del1(100, y); del1(10, 20);
Gọi del2
string s = del2(100f);
9
v1.0011106203
float f =0.5f; string s; s = del2(f);
1.2. MULTICAST DELEGATE
• 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.
Ví dụ multicast delegate
Console.WriteLine(“x = {0}, y = {1}”, x, y);
Console.WriteLine(“Tong = {0}”, x+y);
15. void Print(int x,int y) { 16. } 17. 18. void Sum(int x, int y) { 19. 20. }
10
v1.0011106203
21. MyDelegate1 mulDel = new MyDelegate1(Print); 22. mulDel += new MyDelegate1(Sum); 23. mulDel(5, 10); 24. mulDel -= new MyDelegate1(Print); 25. mulDel(5,10);
1.3. SỰ KIỆN - EVENT
• 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ý
11
v1.0011106203
sự kiện.
1.3. SỰ KIỆN – EVENT (tiếp theo)
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.
event event
subscribe subscribe
Thông báo
publish publish
BB
Đăng ký
AA
CC
12
v1.0011106203
1.3. SỰ KIỆN – EVENT (tiếp theo)
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:
13
v1.0011106203
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)
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
14
v1.0011106203
• 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)
• 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.
15
v1.0011106203
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)
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.
16
v1.0011106203
Ủ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)
Trình xử lý của DigitalClock
Đối tượng phát sinh sự kiện Tên của trình xử lý
public void Show(object obj, EventArgs args) {
DateTime date = DateTime.Now; Console.WriteLine("Digital Clock: {0}:{1}:{2}",
date.Hour, date.Minute, date.Second);
17
v1.0011106203
}
1.3. SỰ KIỆN – EVENT (tiếp theo)
Đăng ký xử lý sự kiện
Đối tượng này sẽ phát sinh sự kiện
public void Subscribe(Clock theClock) {
theClock.OnSecondChange +=
new Clock.SecondChangeHandler(Show);
}
Ủy thác phương thức Show cho OnSecondChange
18
v1.0011106203
1.3. SỰ KIỆN – EVENT (tiếp theo)
Tạo lớp DigitalClock
public class DigitalClock {
public void Subscribe(Clock theClock) {
40. 41. 42. 43. 44. +=
theClock.OnSecondChange new Clock.SecondChangeHandler(Show);
45. }
public void Show(object obj, EventArgs args) {
Clock: 46. 47. 48. 49. {0}:{1}:{2}",
DateTime date = DateTime.Now; Console.WriteLine("Digital date.Hour, date.Minute, date.Second);
}
19
v1.0011106203
50. 51. }
1.4. XỬ LÝ NGOẠI LỆ
• 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) lệ không thể sửa các bug mà nên viết lại lệ. Ngoại
và phát sinh ra ngoạ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.
20
v1.0011106203
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Ệ (tiếp theo)
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.
21
v1.0011106203
• 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)
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”
22
v1.0011106203
}
1.4. XỬ LÝ NGOẠI LỆ (tiếp theo)
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
23
v1.0011106203
chương trình.
1.4. XỬ LÝ NGOẠI LỆ (tiếp theo)
Ví dụ
66. catch
(IndexOutOfRangeExceptio n e)
try
67. { 68. 69. trace = int[] data1 = new int[10]; string msg = e.Message; string e.StackTrace;
52. void Process(int index) 53. { 54. FileStream data = null; 55. 56. { 57. 58. data1[index] = 17; 59. data = new finally
70. } 71. 72. { 73. data.Close(); 74. } 75. } FileStream("File.dat", FileMode.Create); 60. data.WriteByte(0x10); 61. } 62. catch
(OutOfMemoryException e)
24
v1.0011106203
63. { ... 64. 65. }
1.4. XỬ LÝ NGOẠI LỆ (tiếp theo)
void Save(Bank b)
98.
99.
{
100.
try
101.
{
102.
b.Withdraw(1234, 1000);
103.
}
77. 78. 79. 80. 81. 82. 83. 84. 85.
class BadAccountException : ApplicationException { public int id; public BadAccountException(string msg, int id) :base(msg) { this.id = id; } }
104.
catch (BadAccountException e)
105.
{
106.
int i = e.id;
107.
string s = e.Message;
108.
}
86. 87. 88. 89. 90. 91. 92.
new
BadAccountException("Invalid
109.
}
25
class Bank { public void Withdraw(int id, double amount) { if (!accounts.Contains(id)) { throw account", id); } ... } ... }
93. 94. 95. 96. 97. v1.0011106203
Ví dụ
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#.
26
v1.0011106203
Viết chương trình phát sinh và xử lý ngoại lệ.
PROPERTIES Allow user to leave interaction: Show ‘Next Slide’ Button: Completion Button Label:
Anytime Don't show Next Slide
PROPERTIES Allow user to leave interaction: Show ‘Next Slide’ Button: Completion Button Label:
Anytime Don't show Next Slide