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