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