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

• 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.

pdf28 trang | Chia sẻ: thanhle95 | Lượt xem: 630 | Lượt tải: 1download
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