nền tảng và lập trình hướng đối tượng

388 33 0
nền tảng và lập trình hướng đối tượng

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

GIÁO TRÌNH TRUY CẬP CÁC THÀNH PHẦN TRONG MẢNG ĐÀ CHIỀU CĨ KÍCH THƯỚC KHÁC NHAU M icrosoft NET 10 Tình hình trước MS.NET đời .10 Nguồn gốc NET 12 Microsoft NET 12 Tổng quan 12 Kiến trúc NET Framework 13 Common Language Runtime 15 Thư viện NET Framework 16 Phát triển ứng dụng client 16 Biên địch MSIL 17 Ngôn ngữ C# 18 Ngôn ngữ C# 20 Tại phải sử dụng ngôn ngữ C# .20 C# ngôn ngữ đơn giản 20 C# ngôn ngữ đại 21 C# ngôn ngữ hướng đối tượng 21 C# ngôn ngữ mạnh mẽ 22 C# ngôn ngữ từ khóa 22 C# ngơn ngừ module hóa .22 C# ngôn ngữ phổ biến 22 Ngôn ngữ C# với ngôn ngừ khác 23 Các bước chuẩn bị cho chương trình 24 Chương trình C# đơn giản .25 Phát triển chương trình minh họa 31 Câu hỏi & tập 35 Nen tảng ngôn ngữ C# 39 Kiểu liệu 40 Kiếu liệu xây đựng sẵn 41 Chọn kiểu liệu .42 Chuyển đổi kiểu liệu 43 Biến 44 Gán giá trị xác định cho biến 45 Hằng 46 Kiểu liệt kê .47 CuuDuongThanCong.com Ngơn Ngữ Lập Trình c# Kiểu chuỗi ký tự 50 Định danh 50 Biểu thức 50 Khoảng trắng 51 Câu lệnh 51 Phân nhánh điều kiện 52 Phân nhánh có điều kiện .53 Câu lệnh lặp 60 Toán tử 68 Namespace .76 Các biên dịch 80 Câu hỏi & tập 82 Xây dụng lóp - Đối tượng 87 Định nghĩa lóp 88 Thuộc tính truy cập .91 Tham số phương thức 92 Tạo đối tượng .93 Bộ khởi dựng 93 Khởi tạo biến thành viên 96 Bộ khởi dựng chép 98 Từ khóa this 99 Sử dụng thành viên static 100 Gọi phương thức static .101 Sử dụng khởi dựng static 101 Sử dụng khỏi dựng private 102 Sử dụng thuộc tính static 102 Hủy đối tượng 104 Truyền tham số 107 Nạp chồng phương thức 112 Đóng gói liệu với thuộc tính 116 Thuộc tính đọc 119 Câu hỏi & tập 121 Kế thừa - Đa hình 125 Đặc biệt hóa tống quát hóa 126 Sự kế thừa 129 Thực thi kế thừa .129 Gọi phương thức khởi dựng lớp sở 131 Gọi phương thức lóp sở 132 CuuDuongThanCong.com Ngơn Ngữ Lập Trình C# Điều khiển truy xuất 132 Đa hình 133 Kiểu đa hình 133 Phương thức đa hình 133 Từ khóa new override 137 Lóp trừu tượng 139 Gốc tất lóp- lớp Object 142 Boxing Unboxing liệu 144 Boxing liệu ngầm định 144 Unboxing phải thực tường minh 145 Các lớp lồng nliau 147 Câu hỏi & tập 149 Nạp chồng toán tử 153 Sử dụng tò khóa operator .153 Hỗ trợ ngôn ngữ NET khác 154 Sử dụng toán tử 154 Toán tử so sánh 156 Toán tử chuyển đổi 157 Câu hỏi & tập 163 Cấu trúc 165 Định nghĩa cấu trúc 165 Tạo cấu trúc 168 Cấu trúc kiểu giá trị 168 Gọi khởi dựng mặc định 169 Tạo cấu trúc không gọi new 170 Câu hỏi & tập 172 Thực thi giao diện 176 Thực thi giao diện 177 Thực thi nhiều giao diện 180 Mở rộng giao diện 181 Ket hợp giao diện 181 Truy cập phương thức giao diện 187 Gán đối tượng cho giao diện 187 Toán tử is 188 Toán tử as 190 Giao diện đối lập với trừu tượng 192 Thực thi phủ giao diện 193 Thực thi giao diện tường minh 197 CuuDuongThanCong.com Ngôn Ngữ Lập Trình c# Lựa chọn phương thức giao diện 200 Ẩn thành viên 200 Câu hỏi & tập 207 Mảng, mục, tập họp 211 Mảng 212 Khai báo mảng 213 Giá trị mặc định 214 Truy cập thành phần mảng .214 Khởi tạo thành phần mảng 216 Sử dụng từ khóa params 216 Câu lệiili íoreach .218 Mảng đa chiều 220 Mảng đa chiều kích thước .220 Mảng đa chiều có kích thước khác 224 Chuyển đổi mảng .227 Bộ mục 232 Bộ mục phép gán 236 Sử dụng kiểu chi số khác 237 Giao diện tập hợp 241 Giao diện IEnumerable 242 Giao diện ICollection 246 Danh sách mảng 247 Thực thi IComparable 251 Thực thi IComparer 254 Hàng đợi 259 Ngăn xếp 262 Kiểu từ điển .265 Hastables 266 Giao diện IDictionary 267 Tập khóa tập giá trị 269 Giao diện IDictionaryEnumerator 270 Câu hỏi & tập 271 10 Xử lý chuỗi 275 Lóp đối tượng string 276 Tạo chuồi 276 Tạo chuồi dùng phương thức ToString 277 Thao tác ữên chuỗi 278 Tìm chuỗi 285 CuuDuongThanCong.com Ngơn Ngữ Lập Trình C# Chia chuồi 286 Thao tác chuỗi dùng StringBuilder 288 Các biểu thức quy tắc .290 Sử dụng biểu thức quy tắc qua lớp Regex 291 Sử dụng Regex để tìm tập hợp 294 Sử dụng Regex để gom nhóm 295 Sử dụng CaptureCollection 298 Câu hỏi & tập 301 11 Cơ chế ủy quyền kiện 303 ủ y quyền 304 Sử dụng ủy quyền xác nhận phưưng thức lúc thực thi 304 ủ y quyền tĩnh 314 Dùng ủy quyền thuộc tính 315 Thiết lập thứ tự thi hành với mảng ủy quyềa 316 Multicasting 320 Sự kiện 324 Cơ chế publishing- subscribing 324 Sự kiện ủy quyền 325 Câu hỏi & tập 333 12 Các lóp sở NET 335 Lóp đối tượng NET Framework 335 Lóp Timer 337 Lóp thư mục hệ thống 340 Lóp Math 342 Lóp thao tác tập tin 345 Làm việc với tập tin liệu 351 Câu hỏi & tập 362 13 Xử lý ngoại lệ 364 Phát sinh bắt giữ ngoại lệ 365 Câu lệnh throw 365 Câu lệnh catch 367 Câu lệnh finally 373 Những đối tượng ngoại lệ 375 Tạo riêng ngoại lệ 378 Phát sinh lại ngoại lệ 381 Câu hỏi & tập 385 CuuDuongThanCong.com Ngơn Ngữ Lập Trình C# Tham Khảo Giáo trình “Ngơn ngừ Lập trình c # ” biên dịch tổng hợp từ: ☆ Programming c#, Jesse Liberty, O’Reilly tVC# in 21 Days, Bradley L.Jones, SAMS ☆ Windows Forms Programming with c#, Erik Brown, Manning MSDN Library - April 2002 Quy ước Giáo trình sử dụng số quy ước sau: # Các thuật ngữ giới thiệu lần in nghiêng # Mã nguồn chương trình minh họa dùng font Verdana -10 # Các từ khóa C# dùng font Verdana-10, đậm Verdana-10, bình thường # Tên namspace, lóp, đối tượng, phương thức, thuộc tính, kiện dùng font Verdana10 # Ket chương trình xuất hình console dùng font C o u rie r New-10 CuuDuongThanCong.com Chương MICROSOFT NET • Tình hình trước MS.NET đời • • Nguồn gốc NET Microsoft NET • Tổng quan • Kiến trúc NET Framework • Common Language Runtime (CLR) • Thư viện NET Framework • Phát triển ứng dụng Client • Biên dịch MSIL • Ngơn ngữ C# Tình hình trước MS.NET đòi Trong lĩnh vực cơng nghệ thơng tin giới ngày nay, với phát triển liên tục đa dạng phần mềm, hệ điều hành, môi trường phát triển, ứng dụng liên tục đời Tuy nhiên, việc phát triển khơng đồng lợi ích khác công ty phần mềm lớn làm ảnh hưởng đến người xây dựng phần mềm Cách vài năm Java Sun viết ra, có sức mạnh đáng kế, hướng tới việc chạy nhiều hệ điều hành khác nhau, độc lập với xử lý (Intel, Rise, ) Đặc biệt Java thích hợp cho việc viết ứng dụng Internet Tuy nhiên, Java lại có hạn chế mặt tốc độ thực tế vần chưa thịnh hành Mặc dù Sun Corporation IBM có đẩy mạnh Java, Microsoft dùng ASP đế làm giảm khả ảnh hưởng Java Đe lập trình Web, lâu người ta dùng CGI-Perl gần PHP, ngôn ngữ giống Perl tốc độ chạy nhanh hon Ta triến khai Perl Unix/Linux hay MS Windows Tuy nhiên có nhiều người khơng thích dùng thân ngơn ngữ hay qui ước khác thường Perl không phát triển thống nhất, công cụ xây dựng cho Perl mạnh nhiều nhóm phát triển người ta khơng đảm bảo tương lai ngày tốt đẹp Microsoft -NET CuuDuongThanCong.com Ngôn Ngữ Lập Trình C# Trong giới phát triến ứng dụng ừên Windows ta viết ứng dụng Visual C++, Delphi hay Visual Basic, số công cụ phổ biến mạnh Trong Visual C++ ngơn ngữ mạnh khó sử dụng Visual Basic đơn giản dễ học, dỗ dùng nên thơng dụng Lý Visual Basic giúp có thê viết chương trình Windows dễ dàng mà không cần thiết phải biết nhiều cách thức MS Windows hoạt động, ta cần biết số kiến thức tối thiểu MS Windows lập trình Do theo quan điếm Visual Basic nên liên kết với Windows điều tự nhiên dễ hiếu, hạn chế Visual Basic ngôn ngữ hướng đổi tượng (Object Oriented) Delphi hậu duệ Turbo Pascal Borland Nó giống tương đối dỗ dùng Visual Basic Delphi mội ngôn ngữ hưứrig đối tưựng Các điều khiến dùng Irên Form Delphi tự động khởi tạo mã nguồn Tuy nhiên, chức khởi động mã nguồn Delphi gặp rắc rối có can thiệp người dùng vào Sau công ty Borland bị bán chuyên gia xây dựng nên Delphi chạy qua bên Microsoft, Delphi khơng phát triển tốt nữa, người ta không dám đầu tư triển khai phần mềm vào Delphi Công ty sau phát triến dòng sản phấm Jbuilder (dùng Java) khơng quan tâm đến Delphi Tuy Visual Basic bền không cần phải khỏri tạo mã nguồn Form thiết kế Visual Basic có nhiều khuyết điếm : □ Không hỗ trợ thiết kế hướng đối tượng, khả thừa kế (inheritance) □ Giới hạn việc chạy nhiều tiếu trình ứng dụng, ví dụ ta không dùng Visual Basic đế viết Service kiểu NT □ Khả xử lý lồi yếu, khơng thích hợp mơi trường Multi- tier □ Khó dùng chung với ngơn ngữ khác C++ □ Khơng có User Interface thích họp cho Internet Do Visual Basic khơng thích hợp cho viết ứng Web Server nên Microsoft tạo ASP (Active Server Page) Các trang ASP vừa có tag HTML vừa chứa đoạn script (VBScript, JavaScript) nằm lẫn lộn Khi xử lý trang ASP, tag HTML gởi thắng qua Browser, script chuyến thành dòng HTML gởi đi, ngoại trừ function hay sub ASP vị trí script khác quan trọng Khi số chức viết tốt người ta dịch thành ActiveX đưa vào Web Server Tuy nhiên lý bảo mật nên ISP (Internet Service Provider ) làm máy chủ cho Web site thường dè đặt cài ActiveX lạ máy họ Ngoài việc tháo gỡ phiên ActiveX cơng việc khó, thường xun làm cho Administrator nhức đầu Những người quản lý version DLL Windows điều than phiền phải đăng ký DLL đăng ký phiên DLL mà Và từ ‘"DLL H eir xuất tức địa ngục DLL Microsoft -NET CuuDuongThanCong.com Ngơn Ngữ Lập Trình C# Sau để giúp cho việc lập trình ASP nhanh hon cơng cụ Visual InterDev, IDE (Integrated Development Environment) đời Visual InterDev tạo Design Time Controls cho việc thiết kế điều khiến web, Tiếc thay Visual InterDev không bền vừng nên sau thời gian nhà phát triến ròi bỏ Tóm lại thân ASP số khuyết điểm quan trọng, chạy Internet Information Server với Windows NT 4, ASP khơng đáng tin cậy lam Tóm lại giới lập trình theo Microsoft việc lập trình desktop lập trình hệ phân tán hay web không nhịp nhàng cho Để chuyến từ lập trinh client hay desktop đến lập trình web chặng đường dài Nguồn gốc NET Đầu năm 1998, sau hoàn tất phiên Version Internet Information Server (IIS), đội ngũ lập trình Microsoft nhận thấy họ nhiều sáng kiến để kiện toàn IIS Họ bắt đầu xây dựng kiến trúc mói tảng ý tưởng đặt tên Next Generation Windows Services (NGWS) Sau Visual Basic trình làng vào cuối 1998, dự án mang tên Visual Studio xác nhập vào NGWS Đội ngũ COM+/MTS góp vào universal runtime cho tất ngơn ngữ lập trình chung Visual Studio, tham vọng họ cung cấp cho ngôn ngữ lập trình cơng ty khác dùng chung ln Cơng việc xúc tiến cách hồn tồn bí mật hội nghị Professional Developers’ Conference Orlado vào tháng 7/2000 Đến tháng 11/2000 Microsoft phát hành Beta NET gồm đĩa CD Tính đến lúc Microsoft làm việc với NET gần năm rồi, Beta tương đối vững .NET mang dáng dấp sáng kiến áp dụng trước p-code UCSD Pascal Java Virtual Machine Có điều Microsoft góp nhặt sáng kiến người khác, kết họp với sáng kiến đế làm nên sản phấm hồn chỉnh từ bên lẫn bên ngồi Hiện Microsoft cơng bố phiên release NET Thật Microsoft đặt cược vào NET theo thơng tin cơng ty, tập trung 80% sức mạnh Microsoft đế nghiên cứu triển khai NET (bao gồm nhân lực tài ?), tất sản phấm Microsoft chuyến qua NET Microsoft NET Tông quan Microsoft NET gồm phần : Framework Integrated Development Environment (IDE) Framework cung cap can thiết bản, chữ Framework có nghĩa khung hay khung cảnh ta dùng hạ tầng sở theo qui ước định để công việc trơi chảy IDE cung cấp mơi trường giúp triển khai dề dàng, nhanh chóng ứng dụng dựa tảng NET Neu IDE 10 Microsoft -NET CuuDuongThanCong.com Ngơn Ngữ Lập Trình C# dùng trình soạn thảo ví Notepad hay trinh soạn thảo văn sử dụng command line đế biên dịch thực thi, nhiên việc nhiều thòi gian Tốt dùng IDE phát triến ứng dụng, cách dỗ sử dụng Thành phần Framework quan trọng NET cốt lõi tinh hoa mơi trường, IDE công cụ đế phát trien dựa tảng thơi Trong NET tồn ngơn ngừ c#, Visual c++ hay Visual Basic.NET dùng IDE Tóm lại Microsoft NET tảng cho việc xây dựng thực thi ứng dụng phân tán hệ Bao gồm ứng dụng từ client đến server dịch vụ khác Một số tính Microsoft NET cho phép nhà phát triển sử dụng sau: □ Một mơ hình lập trình cho phép nhà phát triển xây dựng ứng dụng dịch vụ web ứng dụng client vứi Extensible Markup Language (XML) □ Tập hợp dịch vụ XML Web, Microsoft NET My Services cho phép nhà phát triến đơn giản tích hợp người dùng kinh nghiệm □ Cung cấp server phục vụ bao gồm: Windows 2000, SQL Server, BizTalk Server, tất điều tích họp, hoạt động, quản lý dịch vụ XML Web ứng dụng □ Các phần mem client Windows XP Windows CE giúp người phát triển phân phối sâu thuyết phục người dùng kinh nghiệm thơng qua dòng thiết bị □ Nhiều cơng cụ hỗ trợ Visual Studio NET, đế phát triển dịch vụ Web XML, ứng dụng Windows hay web cách dể dàng hiệu Kiến trúc N ET Framework ■NET Framework platform làm đơn giản việc phát trien ứng đụng môi trường phân tán Internet .NET Framework thiết kế đầy đủ để đáp ứng theo quan điểm sau: □ Đe cung cấp mơi trường lập trình hướng đối tượng vững chắc, mã nguồn đối tượng lưu trữ thực thi cách cục Thực thi cục phân tán Internet, thực thi từ xa □ Đề cung cấp môi trường thực thi mã nguồn mà tối thiểu việc đóng gói phần mềm tranh chấp phiên □ Để cung cấp môi trường thực thi mã nguồn mà đám báo việc thực thi an toàn mã nguồn, bao gồm việc mã nguồn tạo hãng thứ ba hay hãng mà tuân thủ theo kiến trúc NET □ Đe cung cấp môi trường thực thi mã nguồn mà loại bỏ lỗi thực script hay môi trường thông địch □ Đe làm cho người phát triển có kinh nghiệm vững nắm vừng nhiều kiểu ứng dụng khác Như từ ứng dụng Windows đến ứng dụng dựa web 11 Microsoft -NET CuuDuongThanCong.com Ngơn Ngữ Lập Trình C# { Console.WriteLine("Open file here"); double a = 5; double b = 0; Console.WriteLine("{0} / { } = {2}", a, b, DoDivide(a,b)); Console.WriteLine("This line may or not print"); > catch (System DivideByZeroException) { Console.WriteUne("DivideByZeroException caught!"); > catch { Console.WriteUne("Unknown exception caught"); > finally { Console.WriteLine("Close file here."); > > // thực chia hợp lệ public double DoDivide(double a, double b) { if ( b == 0) { throw new System.DivideByZeroExceptionQ; > if ( a == 0) { throw new System,ArithmeticExceptionO; > return a/b; > > > s Ket quả: Open file here 375 xư Lý Ngoại Lệ CuuDuongThanCong.com Ngơn Ngữ Lập Trình C# DivideByZeroException caught! Close file here Kết trường hợp b = 12 Open file here 5/ 12 = 0.416666666666 Close file here Trong ví dụ khối catch loại bỏ thêm vào khối finally Bất ngoại lệ có phát sinh hay khơng khối lệnh bên finally thực thi Do nên hai trường hợp ta thấy xuất thông điệp “Close file here” Những đối tượng ngoại lệ Cho đến lúc sử dụng tốt ngoại lệ cách xử lý khắc phục ngoại lệ Trong phần tiến hành việc tìm hiểu đối tượng xây dựng cho việc xử lý ngoại lệ Đối tượng System.Exception cung cấp số phương thức thuộc tính hữu dụng Thuộc tính Message cung cấp thơng tin ngoại lệ, lý ngoại lệ phát sinh Thuộc tính Message thuộc tính đọc, đoạn chương trình phát sinh ngoại lệ thiết lập thuộc tính Message đối mục cho khởi dựng ngoại lệ Thuộc tính HelpLink cung cấp liên kết để trợ giúp cho tập tin liên quan đến ngoại lệ Đây thuộc tính đọc Thuộc tính StackTrace thuộc tính đọc thiết lập CLR Trong ví dụ 13.6 thuộc tính Exception.HelpLink thiết lập truy cập để cung cấp thông tin cho người sử dụng ngoại lệ DivideBy-ZeroException Thuộc tính StackTrace ngoại lệ sử dụng để cung cấp thông tin stack cho câu lệnh lồi Một thông tin stack cung cấp hàng loạt gọi stack phương thức gọi mà dẫn đến ngoại lệ phát sinh Ví dụ 13.6: Làm việc với đối tượng ngoại lệ namespace Programming_CSharp using System; public class Test { public static void MainQ { Test t = new Test(); t.TestFunc(); > // chia hai so va xu" ly ngoai le 376 xư Lý Ngoại Lệ CuuDuongThanCong.com Ngơn Ngữ Lập Trình C# public void TestFuncQ { try < Console.WriteLine("Open file here"); double a = 12; double b = 0; Console.WriteLine("{0> / { } = {2}", a, b, DoDivide(a,b)); Console.WriteLine("This line may or not print"); > catch (System.DivideByZeroException e) < Console.WriteLine("\nDivideByZeroException! Msg: {0 }" , e.Message); Console.WnteUne("\nHelpUnk: { } " , e.HelpLink); Console.WriteUne("\nHere's a stack trace: {0 }\n ", e.StackTrace); > catch < Console.WriteUne("Unknown exception caught"); > > // thực phép chia hợp lệ public double DoDivide( double a, double b) { if ( b == 0) { DivideByZeroException e = new DivideByZeroExceptionO; e.HelpLink = " http://www.hcmunc.edu.vn"; throw e; > if ( a == 0) { throw new ArithmeticExceptionQ; > return a/b; > > 377 Xứ Lý Ngoại Lệ CuuDuongThanCong.com Ngơn Ngữ Lập Trình C# B Kết quả: Open file here DivideByZeroException Msg: Attenpted to divide by zero HelpLink: http://www.hcmuns.edu.vn Here's a stack trace: at Programming_CSharp.Test.DoDivide(Double c, Double b) in c :\ exception06.cs: line 56 at Programming_CSharp.Test.TestFunc() in exception06.cs: line 22 Close file here Trong đoạn kết trên, danh sách trace stack hiển thị theo thứ tự ngược lại thứ tự gọi Nó hiến thị lỗi phương thức DoDivde(), phương thức gọi từ phương thúc TestFunc() Khi phương thức gọi lồng nhiều cấp, thơng tin stack có thề giúp hiểu thứ tự phương thức gọi Trong ví dụ này, việc đơn giản phát sinh DidiveByZeroException, tạo hện ngoại lệ: DivideByZeroException e = new DivideByZeroException(); Chúng ta không truyền vào thông điệp chúng ta, nên thông điệp mặc định in ra: DivideByZeroException! Msg: Attemped to divide by zero Ớ bố sung dòng lệnh bên đế truyền vào thơng điệp tùy chọn sau: new DivideByZeroException("You tried to divide by zero which is not meaningful"); Trước phát sinh ngoại lệ, thiết lập thuộc tính HelpLink sau: e.HelpLink = "http://www.hcmunc.edu.vn"; Khi ngoại lệ bắt giữ, chương trình in thơng điệp HelpLink hình: catch (System DivideByZeroException e) { Console.WriteUne("\nDivideByZeroException! Msg: { } " , e Message); Console.WriteUne("\nHelpLink: {0 } " , e.HelpLink); > Việc làm cho phép cung cấp thơng tin hữu ích cho người sử dụng Thêm vào thơng tin stack đưa cách sử dụng thuộc tính StackTrace đối tượng ngoại lệ: Console.WriteLine("\n Here's a stack trace: {0 }\n " , e.StackTrace); Ket vet stack xuất ra: Here's a stack trace: at Programming_CSharp.Test.DoDivide(Double c, Double b) 378 Xứ Lý Ngoại Lệ CuuDuongThanCong.com Ngơn Ngữ Lập Trình C# in c:\ exception06.cs: line 56 at Programming_CSharp.Test.TestFunc() in exception06.cs: line 22 Lưu ý rằng, phần đường dẫn viết tắt, kết bạn khác tí Bảng 13.1 sau mô tả số lớp ngoại lệ chung khai báo bên namespace System CÁC LỚP NGOAI LÊ Tên ngoại lệ Mô ta MethodAccessException Lỗi truy cập, truy cập đến thành viên hay phương thức không truy cập ArgumentException Lỗi iharn số đối rnục ArgumentNullException Đối mục Null, phương thức truyền đối mục null không chấp nhận ArithmeticException Lỗi liên quan đến phép tốn ArrayTypeMismatchException Kiếu mảng khơng hợp, cố lưu trữ kiểu khơng thích hợp vào mảng DivideByZeroException Lồi chia zero FormatException Định dạng khơng xác đối mục IndexOutOfRangeException Chỉ số truy cập mảng khơng họp lệ, dùng nhỏ số nhỏ hay lớn số lớn mảng InvalidCastException Phép gán không hợp lệ MulticastNotSupportedException Multicast không hồ trợ, đo việc kết họp hai delegate không NotFiniteNumberException Không phải số hữu hạn, số không hợp lệ NotSupportedException Phương thức không hồ trợ, gọi phương thức không tồn bên lớp NullReferenceException Tham chiếu null không hợp lệ OutOfMemoryException Out of memory Overflow/Exception Lỗi tràn phép toán StackOverflowException Tràn stack TypelnitializationException Kiếu khởi tạo sai, khỏi dựng tĩnh có lỗi Bảng 13.1 : Các ngoại lệ thường xuất Tạo riêng ngoại lệ CLR cung cấp kiểu liệu ngoại lệ bản, ví dụ trước tạo vài kiểu ngoại lệ riêng Thông thường cần thiết phải cung cấp thông tin mở rộng cho khối catch ngoại lệ phát sinh Tuy nhiên, có lúc 379 Xừ Lý Ngoại Lệ CuuDuongThanCong.com Ngơn Ngữ Lập Trình C# muốn cung cấp nhiều thông tin mở rộng khả đặc biệt cần thiết ngoại lệ mà tạo Chúng ta dễ dàng tạo ngoại lệ riêng, hay gọi ngoại lệ tùy chọn (custom exception), điều bắt buộc với ngoại lệ chúng phải dẫn xuất từ System.ApplicationException Ví dụ 13.7 sau minh họa việc tạo ngoại lệ riêng Ví dụ: Tạo ngoại lệ riêng namespace Programming_CSharp { using System; // tạo ngoại lệ riêng public class MyCustomException : System.ApplicationException { public MyCustomException( string message): base(message) { > > public class Test { public static void MainQ { Test t = new TestQ; t.TestFuncQ; > // chia hai sổ xử lý ngoại lệ public void TestFuncO { try { Console.WriteUneC'Open file here"); double a = 0; double b = 5; Console.WriteUne("{0} / { } = {2}"f a, b, DoDivide(a,b)); Console.WriteUne("This line may or not print"); > catch (System.DivideByZeroException e) { Console.WriteUne("\nDivideByZeroException! Msg: {0 }" , e.Message); 380 xư Lý Ngoại Lệ CuuDuongThanCong.com Ngôn Ngữ Lập Trình C# Console.WriteLine("\nHelpUnk: { } " , e.HelpLink); > catch (MyCustomException e) { Console.WriteUne("\nMyCustomException! Msg: {0 }" , e Message); Console.WriteUne("\nHelpLink: { } " , e.HelpLink); > catch { Console.WriteUne("Unknown excepiton caught"); > finally { Console.WriteLine("Close file here."); > > // thực phép chia hợp lệ public double DoDivide( double a, double b) { if ( b == 0) { DivideByZeroException e = new DivideByZeroExceptionQ; e.HelpLink = "http://www.hcmunc.edu.vn"; throw e; > if ( a == 0) { MyCustomException e = new MyCustomException("Can't have zero divisor"); e.HelpLink = "http://www.hcmuns.edu.vn"; throw e; > return a/b; > > 381 Xừ Lý Ngoại Lệ CuuDuongThanCong.com Ngơn Ngữ Lập Trình C# Lớp MyCustomException dần xuất từ System.ApplicationException lớp khơng có thực thi hay khai báo ngồi hàm khởi dựng Hàm khởi dựng lấy tham số chuồi truyền cho lớp sở Trong trường hợp này, lợi ích việc tạo ngoại lệ làm bật điều mà chuơng trình muốn minh họa, tức không cho phép số chia zero Sử dụng ngoại lệ ArithmeticException tốt hon ngoại lệ tạo Nhưng làm nhẩm lẫn cho người lập trình khác phép chia với số chia zero lỗi số học Phát sinh lại ngoại lệ Giả sử muốn khối catch thực vài hành động sau phát sinh lại ngoại lệ bên khối catch (trong hàm gọi) Chúng ta phép phát sinh lại ngoại lệ hay phát sinh lại ngoại lệ khác Neu phát sinh ngoại lệ khác, phải nhúng ngoại lệ ban đầu vào bên ngoại lệ đế phương thức gọi hiếu lai lịch nguồn gốc ngoại lệ Thuộc tính InnerException ngoại lệ mói cho phép truy cập ngoại lệ ban đầu Bởi InnerException ngoại lệ, nên có ngoại lệ bên Do vậy, toàn dây chuyền ngoại lệ đóng tố (nest) ngoại lệ với ngoại lệ khác Giống lật đật, chứa đến lượt bên lại chứa Vỉ dụ 13.8: Phát sinh lại ngoại lệ & ngoại lệ inner namespace Programming_CSharp { using System; // tạo ngoại lệ riêng public class MyCustomException : System Exception { public MyCustomException( string message, Exception inner): base(message, inner) { > > public class Test { public static void MainQ { Test t = new Test(); 382 xư Lý Ngoại Lệ CuuDuongThanCong.com Ngơn Ngữ Lập Trình C# t.TestFuncQ; > // chia hai sô x iï lÿ ngoai lê public void TestFunc() { try { DangerousFunclQ; > catch (MyCustomException e) { Console.WriteLine("\n{0>", e.Message); Console.WriteLine("Retrieving exception history "); Exception inner = e.InnerException; while ( inner != null) { Console.WriteLine("{0>", inner.Message); inner = inner.InnerException; > > public void DangerousFunclQ { try { DangerousFunc2(); > catch (System.Exception e) { MyCustomException ex = new MyCustomException("E3 - Custom Exception Situation", e); throw ex; > > public void DangerousFunc2() { try { 383 Xứ Lý Ngoại Lệ CuuDuongThanCong.com Ngơn Ngữ Lập Trình C# DangerousFunc3(); > catch (System DivideByZeroException e) { Exception ex = new Exception("E2 - Func2 caught divide by zero", e); throw ex; > > public void DangerousFunc3() { try { DangerousFunc4(); > catch (System.ArithmeticException) { throw; > catch (System.Exception) { Console.WriteLine("Exception handled here."); > > public void DangerousFunc4() { throw new DivideByZeroExceptionC'El - DivideByZero Exception"); > > > s Ket quả: E3 - Custom Exception Situation Retrieving exception history E2 - Func2 caught divide by zero El - DivideByZeroException Để hiếu rõ ta dùng trình debugger đế chạy bước chương trình ta hiểu rõ bước thực thi việc phát sinh ngoại lệ 384 Xử Lý Ngoại Lệ CuuDuongThanCong.com Ngơn Ngữ Lập Trình C# Chương trình bắt đầu với việc gọi hàm DangerousFuncl() khối try: try { DangerousFunclQ; > DangerousFuncl() gọi DangerousFunc2(), DangerousFunc2() lại gọi DangerousFunc3(), cuối DangerousFunc3() gọi DangerousFunc4() Tất việc gọi điều nằm khối try Cuối cùng, DangerousFunc4() phát sinh ngoại lệ DivideByzeroException Ngoại lệ bình thường có chứa thơng điệp bên nó, tự dùng thông điệp Đế dỗ theo dõi đưa vào chuồi xác nhận kiện diễn Ngoại lệ đưực phát sinh Irơng DangerousFunc4() nỏ đưựe bắt khối catch Irong hàm DangerousFunc3() Khối catch DangerousFunc3() bắt ngoại lệ ArithmeticException ( DivideByZeroException), khơng thực hành động mà đon giản phát sinh lại ngoại lệ: catch ( System.ArithmeticException) { throw; > Cú pháp đế thực phát sinh lại ngoại lệ mà khơng có bố sung hay hiệu chỉnh : throw Do ngoại lệ phát sinh cho DangerousFunc2(), khối catch DangerousFunc2() thực vài hành động tiếp tục phát sinh ngoại lệ có kiếu Trong hàm khởi dựng ngoại lệ mới, DangerousFunc2() truyền chuỗi thông điệp (“£2 - Func2 caught divide by zero”) ngoại lệ ban đầu Do ngoại lệ ban đầu (E l) trở thành ngoại lệ bên ngoại lệ (E2) Sau hàm DangerousFunc2() phát sinh ngoại lệ (E2) cho hàm DangerousFuncl() DangerousFuncl() bắt giữ ngoại lệ này, làm số công việc tạo ngoại lệ có kiểu MyCustomException, truyền vào hàm khởi dựng ngoại lệ chuồi (“E3 - Custom Exception Situation!”) ngoại lệ bắt giữ (E2) Chúng ta nên nhớ ngoại lệ bắt giữ ngoại lệ có chứa ngoại lệ DivideByZeroException ( E l) bên Tại thời điếm này, có ngoại lệ kiểu MyCustomException (E3) ngoại lệ chứa bên ngoại lệ kiểu Exception (ỊE2), đến lượt chứa ngoại lệ kiểu DivideByZeroException (E l) bên Sau ngoại lệ phát sinh cho hàm TestFunc; Khi khối catch TestFunc thực in thơng điệp ngoại lệ : E3 - Custom Exception Situation! sau ngoại lệ bên ừong lấy thơng qua vòng lặp while: while ( inner != null) { 385 Xứ Lý Ngoại Lệ CuuDuongThanCong.com Ngơn Ngữ Lập Trình C# Console.WriteLine("", inner.Message); inner = inner.InnerException; > Ket chuồi ngoại lệ phát sinh bắt giữ: Retrieving exception history E2 - Func2 caught divide by zero E l - DivideByZero Exception Câu hỏi trả lòi Câu hỏi 1: Việc sử dụng catch khơng có tham số có nhiều sức mạnh chúng bắt tất ngoại lệ Tại khơng ln ln sử dụng câu lệnh catch khơng có tham số để bắt lồi? Trả lời 1: Mặc dù sử dụng catch có nhiều sức mạnh, nò làm nhiều thơng tin quan trọng ngoại lệ phát sinh Khi khơng biết xác loại ngoại lệ xảy khó bảo trì khắc phục ngoại lệ sau phía người dùng Nếu chương trình gặp ngoại lệ mà khơng có thơng báo rỗ ràng cho nguời dùng làm cho họ hoang mang, đổ lỗi cho chương trình chủng ta khơng tốt lỗi khơng phải ta Ví dụ lồi hết tài nguyên nhớ người dùng sử dụng nhiều chương trình hoạt động lúc Tóm lại nên sử dụng catch với tham số chi tiết để thực tốt việc quản lý ngoại lệ phát sinh Câu hỏi 2: Có phải tất ngoại lệ đối xử cách bình đẳng? Trả lời 2: Khơng phải, có hai loại ngoại lệ, ngoại lệ hệ thống ngoại lệ chương trình ứng dụng Ngoại lệ cứa chương trình ứng dụng khơng kết thúc chương trình Còn ngoại lệ hệ thống kết thúc chương trình Nói chung đỏ ngoại lệ xuất trước Hiện người ta chia nhiều mức độ ngoại lệ tùy theo mức độ ngoại lệ mà chương trình nhận ứng xử khác Đê biết thêm chi tiết chủng ta đọc thêm tài liệu NET Framework xử lý ngoại lệ Câu hỏi 3: Như câu trả lời bên tơi phải tìm hiểu nhiều ngoại lệ cách thức xử lý ngoại lệ chúng phát sinh? Trả lời 3: Việc xây dựng chương trình ứng dụng hểt sức phức tạp, chương trình tiếm ẩn yếu tố không on định phát sinh ngoại lệ dẫn đến lỗi không mong muốn Việc thực bắt giữ ngoại lệ hểt sức cần thiết chương trình, cho phép xây dựng chương trình hồn thiện xử lý thơng điệp ngoại lệ tắt Tìm hiểu ngoại lệ đem đến cho chủng ta nhiều kinh nghiệm việc xây dựng chương trình phức tạp Câu hỏi thêm Câu hỏi 1: Hãy cho biết từ khỏa sử dụng đế xử lý ngoại lệ? 386 Xử Lý Ngoại Lệ CuuDuongThanCong.com Ngơn Ngữ Lập Trình C# Câu hỏi 2: Phân biệt lỗi ngoại lệ? Câu hỏi 3: Khi thực việc bắt giữ ngoại lệ Nếu có nhiều mức bắt giữ ngoại lệ chủng ta thực mức Từ chi tiết đến tông quát, hay từ tổng quát đến chi tiết? Câu hỏi 4: Ỷ nghĩa từ khóa finally việc xử lý ngoại lệ? Câu hỏi 5: Câu lệnh dùng đế phát sinh ngoại lệ? Câu hỏi 6: Loại sau nên xử lý theo ngoại lệ loại nên xử lý mã lệnh thông thường? a Giá trị nhập vào người dùng không nằm mức cho phép b Tập tin không viết mà thực viết c Đối mục truyền vào cho phương thức chứa giá trị không hợp lệ d Đối mục truyền vào cho phương thức chứa kiểu không hợp lệ Câu hỏi 7: Nguyên nhân dẫn đến phát sinh ngoại lệ? Câu hỏi 8: Khi ngoại lệ xuất hiện? a Trong tạo mã nguồn b Trong biên dịch c Trong thực thi chương trình d Khi yêu cầu đựơc đưa ta người dùng cuối Câu hỏi 9: Khi khối lệnh finally thực hiện? Câu hỏi 10: Trong namespace chức lớp liên quan đến việc xử lý ngoại lệ? Hãy cho biết số lớp xử lý ngoại lệ quan trọng namespace này? Bài tập Bài tâp / : Hãy viết đoạn lệnh để thực việc bắt ngoại lệ liên quan đển câu lệnh sau đây: Ketqua = Sothul / Sothu2; Bài tâp 2: Chương trình sau có vấn đề Hãy xác định vấn đề cỏ thể phát sinh ngoại lệ chạy chương trình Và viết lại chương trình hồn chinh gồm lệnh xử lý ngoại lệ: using System; public class Tester { public static void MainQ { uint so l= 0; int so2, so3; so2 = -10; so3 = 0; // tính giá trị lại 387 xư Lý Ngoại Lệ CuuDuongThanCong.com Ngơn Ngữ Lập Trình C# s o l -= 5; so2 = 5/so3; // xuất kết Console.WriteUne("So 1: { } , So 2:{1> ", s o l, so2); > Bài tâp 3: Chương trình sau dẫn đến ngoại lệ hay khơng? Nếu có cho biết ngoại lệ phát sinh Hãy viết lại chương trình hoàn chỉnh cỏ xử lý ngoại lệ cách đưa thông điệp ngoại lệ phát sinh using System; using System 10; public class Tester { public static void MainQ { string fname = "test3.txt"; string buffer; StreamReader sReader = File.OpenText(fname); while ( (buffer = sReader.ReadLineO) ! = null) { Console WriteUne(buffer); > > > Bài tâp 4: Hãy xem lại ví dụ chương trước, ví dụ phái sinh ngoại lệ thêm đoạn xử lý ngoại lệ cho ví dụ 388 Xừ Lý Ngoại Lệ CuuDuongThanCong.com Ngơn Ngữ Lập Trình C# 389 Dùng Visual Studio -NET Xây Dựng ứng Dụng Windows Form CuuDuongThanCong.com ... niệm lập ừình đại C# bao gồm tất hồ trợ cho cấu trúc, thành phần component, lập trình hướng đối tượng Những tính chất diện ngơn ngữ lập trình đại Và ngôn ngữ C# hội đủ điều kiện vậy, xây dựng tảng. .. cậy lam Tóm lại giới lập trình theo Microsoft việc lập trình desktop lập trình hệ phân tán hay web khơng nhịp nhàng cho Để chuyến từ lập trinh client hay desktop đến lập trình web chặng đường... chương trình Ket chuỗi hình console “Chao Mung” xuất Các mục sau giới thiệu xoay quanh ví dụ 2.1, phần chi tiết loại trình bàv chương Lớp, đối tượng kiếu liệu (type) Điều cốt lõi lập trình hướng đối

Ngày đăng: 16/12/2019, 17:05

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan