Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 35 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
35
Dung lượng
652,17 KB
Nội dung
Ngôn Ngữ Lập Trình C# // Filsize.cs namespace Programming_CSharp { using System; using System.IO; public class Tester { public static void Main() { string[] CLA = Environment.GetCommandLineArgs(); FileInfo fiExe = new FileInfo( CLA[0] ); if ( CLA.Length < 2) { Console.WriteLine(“Format: {0} filename”, fiExe.Name); } else { try { FileInfo fiFile = new FileInfo( CLA[1]); if (fiFile.Exists) { Console.WriteLine(“******************************”); Console.WriteLine(“{0} {1}”,fiFile.Name, fiFile.Length); Console.WriteLine(“******************************”); Console.WriteLine(“Last access: {0}”,fiFile.LastAccessTime); Console.WriteLine(“Last write: {0}”, fiFile.LastWriteTime); Console.WriteLine(“Creation: {0}”, fiFile.CreationTime); Console.WriteLine(“******************************”); } else { Console.WriteLine(“{0} doesn’t exist!”, fiFile.Name); } } catch (System.IO.FileNotFoundException) { Các Lớp Cơ Sở .NET 351 Ngôn Ngữ Lập Trình C# Console.WriteLine(“\n{0} does not exists!”, CLA[1]); return; } catch (Exception e) { Console.WriteLine(“\n An exception was thrown trying to copy file”); Console.WriteLine(); return; }// end catch }// end else }// end Main }// end class }// end namespace Kết quả: ****************************** filesize.cs 1360 ****************************** Last access: 12/5/2002 12:00:00 AM Last write: 12/5/2002 5:50:50 PM Creation: 12/5/2002 5:53:31 PM ****************************** Một đối tượng FileInfo được tạo ra và gắn với một tập tin tương ứng: FileInfo fiInfo = new FileInfo( CLA[1]); Tham số của bộ khởi dựng lớp FileInfo xác định tên của tập tin mà nó sẽ chứa nhận thông tin, trong trường hợp này nó sẽ lấy tham số thứ hai của tham số dòng lệnh làm tập tin mà nó sẽ thực hiện. Nếu người dùng không nhập tên tập tin thì chương trình sẽ in ra tên của chương trình. Làm việc với tập tin dữ liệu Phần trước chúng ta đã thực hiện công việc như lấy thông tin của tập tin và sao chép tập tin sang một tập tin mới. Việc thực hiện quan trọng của tập tin là đọc và viết những thông tin từ tập tin. Trong phần này chúng ta sẽ tìm hiểu về luồng nhập xuất và cách tạo mới một tập tin để ghi hay mở một tập tin đã tồn tại để đọc thông tin. Luồng nhập xuất Thuật ngữ tập tin thì nói chung là liên quan đến những thông tin lưu trữ bên trong ỗ đĩa hoặc trong bộ nhớ. Khi làm việc với tập tin, chúng ta bao hàm với việc sử dụng một luồng. Các Lớp Cơ Sở .NET 352 Ngôn Ngữ Lập Trình C# Nhiều người nhầm lẫn về sự khác nhau giữa tập tin và luồng. Một luồng đơn giản là luồng của thông tin, chứa thông tin sẽ được chuyển qua, còn tập tin thì để lưu trữ thông tin. Một luồng được sử dụng để gởi và nhận thông tin từ bộ nhớ, từ mạng, web, từ một chuỗi, Một luồng còn được sử dụng để đi vào và ra với một tập tin dữ liệu. Thứ tự của việc đọc một tập tin Khi đọc hay viết một tập tin, cần thiết phải theo một trình tự xác định. Đầu tiên là phải thực hiện công việc mở tập tin. Nếu như tạo mới tập tin, thì việc mở tập tin cùng lúc với việc tạo ra tập tin đó. Khi một tập tin đã mở, cần thiết phải tạo cho nó một luồng để đặt thông tin vào trong một tập tin hay là lấy thông tin ra từ tập tin. Khi tạo một luồng, cần thiết phải chỉ ra thông tin trực tiếp sẽ được đi qua luồng. Sau khi tạo một luồng gắn với một tập tin, thì lúc này chúng ta có thể thực hiện việc đọc ghi các dữ liệu trên tập tin. Khi thực hiện việc đọc thông tin từ một tập tin, chúng ta cần thiết phải kiểm tra xem con trỏ tập tin đã chỉ tới cuối tập tin chưa, tức là chúng ta đã đọc đến cuối tập tin hay chưa. Khi hoàn thành việc đọc ghi thông tin trên tập tin thì tập tin cần phải được đóng lại. Tóm lại các bước cơ bản để làm việc với một tậo tin là: Bước 1: Mở hay tạo mới tập tin Bước 2: Thiết lập một luồng ghi hay đọc từ tập tin Bước 3: Đọc hay ghi dữ liệu lên tập tin Bước 4: Đóng lập tin lại Các phương thức cho việc tạo và mở tập tin Có nhiều kiểu luồng khác nhau. Chúng ta sẽ sử dụng những luồng khác nhau và những phương thức khác nhau phụ thuộc vào kiểu dữ liệu bên trong của tập tin. Trong phần này, việc đọc/ghi sẽ được thực hiện trên tập tin văn bản. Trong phần kế tiếp chúng ta học cách đọc và viết thông tin trên tập tin nhị phân. Thông tin nhị phân bao hàm khả năng mạnh lưu trữ giá trị số và bất cứ kiểu dữ liệu nào khác. Để mở một tập tin trên đĩa cho việc đọc và viết tập tin văn bản, chúng ta cần phải sử dụng cả hai lớp File và FileInfo. Một vài phương thức có thể sử dụng trong những lớp này. Các phương thức này bao gồm: AppendText Mở một tập tin để và tập tin này có thể được thêm văn bản vào trong nó. Tạo luồng StreamWriter sử dụng để thêm vào trong văn bản. Create Tạo mới một tập tin CreateText Tạo và mở một tập tin văn bản. Tạo ra một luồng StreamWriter. Open Mở một tập tin để đọc/viết. Mở một FileStream OpenRead Mở một tập tin để đọc OpenText Mở một tập tin văn bản để đọc. Tạo ra StreamReader để sử dụng. OpenWrite Mở một tập tin cho việc đọc và ghi. Các Lớp Cơ Sở .NET 353 Ngôn Ngữ Lập Trình C# Làm thế nào để chúng ta có thể biết được khi nào sử dụng lớp File chính xác hơn là sử dụng lớp FileInfo nếu chúng cùng chứa những phương thức tương tự với nhau. Thật ra hai lớp này có nhiều sự khác biệt. Lớp File chứa tất cả các phương thức tĩnh, thêm vào đó lớp File tự động kiểm tra permission trên một tập tin. Trong khi đó nếu muốn dùng lớp FileInfo thì phải tạo thể hiện của lớp này. Nếu muốn mở một tập tin chỉ một lần thì tốt nhất là sử dụng lớp File, còn nếu chúng ta tổ chức việc sử dụng tập tin nhiều lần bên trong chương trình, tốt nhất là ta dùng lớp FileInfo. Hoặc nếu không chắc chắn cách sử dụng thì chúng ta có thể sử dụng lớp FileInfo. Viết vào một tập tin văn bản Cách tốt nhất để nắm vững cách thức làm việc với tập tin là chúng ta sẽ bắt tay vào tìm hiểu chương trình. Trong phần này chúng ta sẽ tìm hiểu một ví dụ minh họa việc tạo ra một tập tin văn bản rồi sau đó viết lại thông tin vào nó. Ví dụ 12.7: Viết dữ liệu vào tập tin văn bản. //writing.cs:: viết vào một tập tin văn bản namespace Programming_CSharp { using System; using System.IO; public class Tester { public static void Main(String[] args) { if (args.Length < 1) { Console.WriteLine(“Phai nhap ten tap tin.”); } else { StreamWriter myFile = File.CreateText( args[0]); myFile.WriteLine(“Khong co viec gi kho”); myFile.WriteLine(“Chi so long khong ben”); myFile.WriteLine(“Dao nui va lap bien”); myFile.WriteLine(“Quyet chi at lam nen”); for(int i=0; i < 10; i++) { Các Lớp Cơ Sở .NET 354 Ngôn Ngữ Lập Trình C# myFile.Write(“{0} ”,i); } myFile.Close(); } } } } Khi chạy chương trình trên chúng ta phải cung cấp tên của tập tin được tạo mới, nếu không cung cấp thì chương trình sẽ không thực hiện việc tạo tập tin. Giả sử chúng ta có cung cấp một tham số dòng lệnh cho chương trình thì một tập tin văn bản mới được tạo ra có nội dung như sau: Khong co viec gi kho Chi so long khong ben Dao nui va lap bien Quyet chi at lam nen 0 1 2 3 4 5 6 7 8 9 Trong chương trình trên không thực hiện việc xử lý ngoại lệ. Điều này dẫn đến chương trình có thể phát sinh ra những ngoại lệ và những ngoại lệ này không được xử lý. Đây là cách lập trình không tốt, nên yêu cầu người đọc nên thêm các xử lý ngoại lệ vào chương trình trên, ngoại lệ này cũng tương tự như ngoại lệ trong ví dụ trước. Như chúng ta thấy hàm Main có tham số và tham số này sẽ được nhận thông qua dòng lệnh, trong các ví dụ trước, chương trình nhận tham số dòng lệnh thông qua lớp Environment, còn ở đây ta khai báo tham số dòng lệnh trực tiếp cho chương trình. Dòng lệnh đầu tiên của hàm Main() là kiểm tra số tham số nhập vào, nếu không có tham số nào chương trình sẽ xuất ra thông báo là không có tên tập tin và kết thúc chương trình. Trong trường hợp cung cấp tham số đầy đủ chương trình sẽ thực hiện việc tạo mới tập tin. Phương thức CreateText của lớp File được gọi để tạo ra một đối tượng StreamWriter mới gọi là myFile. Tham số được truyền cho hàm là tên của tập tin sẽ được tạo. Kết quả cuối cùng của dòng lệnh này là tạo ra một tập tin văn bản mới. Dữ liệu s4 được đưa vào tập tin thông qua StreamWriter với thể của nó là myFile. Ghi chú: Nếu một tập tin hiện hữu với cùng tên như tập tin mà chúng ta tạo ra thì tập tin cũ sẽ được viết chồng, tức là dữ liệu bên trong tập tin cũ sẽ bị xóa mất. Hình sau minh họa việc thực hiện tạo tập tin và đưa dữ liệu vào Các Lớp Cơ Sở .NET 355 Ngôn Ngữ Lập Trình C# Hình 12.3 : Mô tả thực hiện tạo tập tin và đưa dữ liệu vào Khi một luồng được thiết lập và chỉ đến một tập tin, chúng ta có thể viết vào trong luồng và nó sẽ được viết vào tập tin: myFile.WriteLine(“Khong co viec gi kho”); Dòng lệnh trên viết một chuỗi vào trong tập tin, việc viết này giống như là viết ra màn hình console. Nhưng ở đây là được viết ra thiết bị khác, tức là ra tập tin. Sau khi thực hiện toàn bộ công việc, cần thiết phải đóng luồng lại bằng cách gọi phương thức Close. Đọc tập tin văn bản Đọc dữ liệu từ tập tin văn bản cũng tương tự như việc viết thông tin vào nó. Ví dụ minh họa tiếp sau đây thực hiện việc đọc tập tin mà chúng ta đã tạo ra từ chương trình minh họa 12.7 trước. Đây là chương trình đọc tập tin văn bản. Ví dụ 12.8: Đọc một tập tin văn bản. using System; using System.IO; namespace Programming_CSharp { public class Tester { public static void Main(string[] args) { if ( args.Length < 1) { Console.WriteLine(“Phai nhap ten tap tin”); } else { Các Lớp Cơ Sở .NET 356 Data to be written arg[0] myFile - StreamWriter Disk file Ngôn Ngữ Lập Trình C# string buffer; StreamReader myFile = File.OpenText( args[0]); while ( (buffer = myFile.ReadLine()) !=null) { Console.WriteLine(buffer); } myFile.Close(); } } } } Nếu chúng ta nhập đúng tên của tập tin vừa tạo trong ví dụ trước thì kết quả chương trình thực hiện như sau: Kết quả: Khong co viec gi kho Chi so long khong ben Dao nui va lap bien Quyet chi at lam nen 0 1 2 3 4 5 6 7 8 9 Nếu chương trình được cung cấp đầy đủ tên tập tin thì nó sẽ bắt đầu thực hiện việc đọc thông tin. Đầu tiên là khai báo một chuỗi dùng làm chỗ lưu thông tin đọc tử tập tin ra. Để mở tập tin văn bản thì phương thức OpenText được gọi. Phương thức này được truyền vào tên của tập tin văn bản cần mở. Một lần nữa một luồng tên myFile được tạo ra gắn với tập tin đã cho, luồng này có kiểu là StreamReader. Phương thức ReadLine() của myFile thực hiện việc đọc từng dòng trong tập tin và sau đó được xuất ra màn hình console. Việc đọc này kết hợp với việc kiểm tra là đã đọc đến cuối tập tin chưa, nếu đọc đến cuối tập tin, tức là hàm ReadLine() trả về chuỗi rỗng, lúc này chương trình sẽ kết thúc việc đọc. Cuối cùng hàm Close được gọi để đóng tập tin lại, và chương trình chấm dứt. Trong chương trình này cũng không xử lý ngoại lệ, nếu tập tin không tồn tại chương trình sẽ phát sinh ra ngoại lệ và ngoại lệ này không được xử lý. Đề nghị người đọc nên đưa vào các đoạn xử lý ngoại lệ tương tự như ví dụ 12.6 Viết thông tin nhị phân vào tập tin Nếu chúng ta sử dụng một tập tin văn bản, thì khi chúng ta lưu dữ liệu kiểu số thì phải thực hiện việc chuyển đổi sang dạng chuỗi ký tự để lưu vào trong tập tin văn bản và khi lấy ra Các Lớp Cơ Sở .NET 357 Ngôn Ngữ Lập Trình C# ta cũng lấy được giá trị chuỗi ký tự do đó ta phải chuyển sang dạng số. Đôi khi chúng ta muốn có cách thức nào đó tốt hơn để lưu trực tiếp giá trị vào trong tập tin và sau đó đọc trực tiếp giá trị ra từ tập tin. Ví dụ khi viết một số lượng lớn các số integer vào trong tập tin như là những số nguyên, thì khi đó ta có thể đọc các giá trị này ra như là số integer. Trường hợp nếu chúng được viết vào tập tin với dạng văn bản, thì khi đọc ra ta phải đọc ra văn bản và phải chuyển mỗi giá trị từ một chuỗi đến các số integer. Tốt hơn việc phải thực hiện thêm các bước chuyển đổi, ta có thể gắn một kiểu luồng nhị phân BinaryStream vào trong một tập tin, rồi sau đó đọc và ghi thông tin nhị phân từ luồng này. Tiếp theo ta sẽ xem một ví dụ minh họa việc đọc viết dữ liệu nhị phân vào một tập tin. Mặc dù trong chương trình này thực hiện việc viết 100 giá trị integer vào trong một tập tin nhưng có thể dễ dàng viết bất cứ kiểu dữ liệu nào khác. Ghi chú: Thông tin nhị phân là thông tin đã được định dạng kiểu lưu trữ dữ liệu. Ví dụ 12.9: Viết vào một tập tin nhị phân. //binarywriter.cs using System; using System.IO; namespace Programming_CSharp { public class Tester { public static void Main(string[] args) { if ( args.Length < 1) { Console.WriteLine(“Phai nhap ten tap tin!”); } else { FileStream myFile = new FileStream( args[0], FileMode.CreateNew); BinaryWriter bwFile = new BinaryWriter(myFile); for (int i=0; i < 100; i++) { bwFile.Write(i); } bwFile.Close(); myFile.Close(); } Các Lớp Cơ Sở .NET 358 Ngôn Ngữ Lập Trình C# } } } Cũng tương tự như các ví dụ trên thì tên tập tin được đưa vào tham số dòng lệnh. Nếu chương trình được nhập các tham số đầy đủ, chương trình sẽ thực hiện việc viết thông tin nhị phân vào trong tập tin, và không có output ra màn hình console. Nếu chúng ta mở tập tin và xem thì chỉ thấy các ký tự mở rộng đựơc thể hiện, sẽ không thấy những số đọc được. Trong chương trình này cũng chưa thực hiện việc xử lý các ngoại lệ. Nếu thực hiện việc viết thông tin vào một tập tin đã hiện hữu, thì một ngoại lệ sẽ được phát sinh khi thực hiện lệnh: FileStream myFile = new FileStream( args[0], FileMode.CreateNew); Trong chương trình 12.9 này thực hiện việc tạo và mở tập tin khác với việc mở tập tin văn bản. Lệnh trên tạo một đối tượng FileStream gọi là myFile. Luồng này được gắn với tập tin thông qua bộ khởi dựng. Tham số đầu tiên của bộ khởi dựng là tên của tập tin mà chúng ta tạo (args[0]), tham số thứ hai là mode mà chúng ta mở. Tham số này là giá trị kiểu liệt kê FileMode, trong chương trình thì do chúng ta thực hiện việc tạo mới để ghi nên sử dụng giá trị FileMode.CreateNew. Bảng 12.3 sau liệt kê những mode giá trị khác trong kiểu liệt kê FileMode. Giá trị Định nghĩa Append Mở một tập tin hiện hữu hoặc tạo một tập tin mới Create Tạo một tập tin mới. Nếu một tập tin đã hiện hữu, nó sẽ bị xóa và một tập tin mới sẽ được tạo ra với cùng tên. CreateNew Tạo một tập tin mới. Nếu một tập tin đã tồn tại thì một ngoại lệ sẽ được phát sinh. Open Mở tập tin hiện hữu. OpenOrCreate Mở tập tin hay tạo tập tin mới nếu tập tin chưa tồn tại Truncate Mở một tập tin hiện hữu và xóa nội dung của nó. Bảng 12.4: Giá trị của FileMode. Sau khi tạo ra FileStream, chúng ta cần thiết phải thiết lập để nó làm việc với dữ liệu nhị phân. Dòng lệnh tiếp theo: BinaryWriter bwFile = new BinaryWriter(myFile); Dòng này thiết lập một kiểu viết dữ liệu nhị phân vào trong luồng bằng cách khai báo kiểu BinaryWrite. Đối tượng thể hiện của BinaryWrite là bwFile được tạo ra. myFile được truyền vào bộ khởi dựng BinaryWrite, nó sẽ gắn bwFile với myFile. for (int i=0; i < 100; i++) { bwFile.Write(i); Các Lớp Cơ Sở .NET 359 Ngôn Ngữ Lập Trình C# } Vòng lặp này thực hiện việc viết trực tiếp giá trị integer vào trong BinaryWrite bwFile bằng cách sử dụng phương thức Write. Dữ liệu được viết có thể là kiểu dữ liệu đặc biệt khác. Trong chương trình này thì sử dụng giá trị integer. Khi thực hiện xong các công việc viết vào tập tin, chúng ta cần thiết phải đóng luồng mà chúng tả đã mở. Đọc thông tin nhị phân từ tập tin Trong phần trước chúng ta đã thực hiện việc viết thông tin nhị phân vào trong tập tin, và bây giờ chúng ta mong muốn được đọc các thông tin đã ghi vào trong tập tin. Việc đọc thông tin cũng khá đơn giản như là việc viết vào. Chương trình 12.10 sau minh họa cho công việc này. Ví dụ 12.10: Đọc thông tin nhị phân. // BinaryRead.cs: Doc thong tin tu file nhi phan namespace Programming_CSharp { using System; using System.IO; public class Tester { public static void Main( String[] args) { if ( args.Length < 1) { Console.WriteLine(“Phai nhap ten tap tin”); } else { FileStream myFile = new FileStream( args[0], FileMode.Open); BinaryReader brFile = new BinaryReader(myFile); // đọc dữ liệu Console.WriteLine(“Dang doc tap tin ”); while (brFile.PeekChar() != -1) { Console.Write(“<{0}>”, brFile.ReadInt32()); } Console.WriteLine(“ Doc xong”); brFile.Close(); Các Lớp Cơ Sở .NET 360 [...]... BinaryStream brFile 361 Các Lớp Cơ Sở NET Ngôn Ngữ Lập Trình C# Phương thức được sử dụng để đọc một số nguyên là ReadInt32, chúng ta sử dụng kiểu tên của Framework tốt hơn là kiểu do C# đưa ra Nên nhớ rằng, tất cả những lớp từ Framework điều được gọi bởi ngôn ngữ C# và chúng không phải là một bộ phận của ngôn ngữ C# Những lớp này còn được sử dụng tốt bởi những ngôn ngữ khác C# Ngoài ra lớp BinaryReader... vị trí hiện hành sang 2 byte 362 Các Lớp Cơ Sở NET Ngôn Ngữ Lập Trình C# Đọc 8-byte unsigned integer từ luống hiện hành và chuyển sang 8 byte ReadUInt64 Bảng 12.4: Các phương thức đọc của BinaryReader Câu hỏi và trả lời Câu hỏi 1: Các ngôn ngữ được hỗ trợ bởi NET phải tuân thủ theo quy tắc nào không? Trả lời 1: Như đã trình bày bên trên, các ngôn ngữ NET phải tuân thủ theo quy định chung để có thể... mảng vào một tập tin trên đĩa với dạng nhị phân 364 Các Lớp Cơ Sở NET Ngôn Ngữ Lập Trình C# Chương 13 XỬ LÝ NGOẠI LỆ Phát sinh và bắt giữ ngoại lệ Câu lệnh catch Câu lệnh throw Câu lệnh finally Những đối tượng ngoại lệ Tạo riêng các ngoại lệ Phát sinh lại ngoại lệ Câu hỏi & bài tập Ngôn ngữ C# cũng giống như bất cứ ngôn ngữ hướng đối tượng khác, cho phép xử lý những lỗi và các điều kiện... tập luật để thao tác trên kiểu dữ liệu này, CLS cho phép tạo ra một môi trường thực thi chung mà không cần quan tâm đến từng ngôn ngữ được sử dụng Lợi ích của CLS là mã nguồn được viết thống nhất để quản lý, mã nguồn được viết trong ngôn ngữ này có thể được sử dụng bởi một ngôn ngữ khác Câu hỏi 2: Nếu muốn tìm hiểu về các lớp được cung cấp bởi NET một cách chi tiết thì phải tìm ở đâu? Trả lời 2: Để tìm... 373 Xử Lý Ngoại Lệ Ngôn Ngữ Lập Trình C# Câu lệnh finally Trong một số tình huống, việc phát sinh ngoại lệ và unwind stack có thể tạo ra một số vấn đề Ví dụ như nếu chúng ta mở một tập tin hay trường hợp khác là xác nhận một tài nguyên, chúng ta có thể cần thiết một cơ hội để đóng một tập tin hay là giải phóng bộ nhớ đệm mà chương trình đã chiếm giữ trước đó Ghi chú: Trong ngôn ngữ C#, vấn đề này... in ra thông báo “Exiting try block ”, hay thực hiện lệnh này), mặc dù nó vẫn thoát ra theo thứ tự Func2(), Func1(), và Main() Chuyện gì xảy ra? 369 Xử Lý Ngoại Lệ Ngôn Ngữ Lập Trình C# Khi một ngoại lệ được phát sinh, việc thi hành ngay lập tức sẽ bị tạm dừng và việc thi hành sẽ được chuyển qua khối lệnh catch Nó không bao giờ trả về luồng thực hiện ban đầu, tức là các lệnh sau khi phát ra ngoại lệ... bộ nhớ thì nó sẽ tạo một ngoại lệ Khi một ngoại lệ được tạo ra, việc thực thi của các chức năng hiện hành sẽ bị treo cho đến khi nào việc xử lý ngoại lệ tương ứng được tìm thấy 365 Xử Lý Ngoại Lệ Ngôn Ngữ Lập Trình C# Điều này có nghĩa rằng nếu chức năng hoạt động hiện hành không thực hiện việc xử lý ngoại lệ, thì chức năng này sẽ bị chấm dứt và hàm gọi sẽ nhận sự thay đổi đến việc xử lý ngoại lệ Nếu... ngoại lệ nào, thì nó sẽ kết thúc chương trình Ví dụ 13.1: Throw ngoại lệ namespace Programming_CSharp { using System; public class Test { 366 Xử Lý Ngoại Lệ Ngôn Ngữ Lập Trình C# public static void Main() { Console.WriteLine(“Enter Main ”); Test t = new Test(); t.Func1(); Console.WriteLine(“Exit Main ”); } public void Func1() { Console.WriteLine(“Enter Func1 ”);... thi sẽ ngưng ngay tức khắc, và CLR sẽ tìm kiếm trình xử lý ngoại lệ trong hàm Func2() Do không tìm thấy ở đây, CLR tiếp tục vào stack lấy hàm đã gọi trước tức là Func1 và tìm kiếm 367 Xử Lý Ngoại Lệ Ngôn Ngữ Lập Trình C# trình xử lý ngoại lệ Một lần nữa trong Func1 cũng không có đoạn xử lý ngoại lệ Và CLR trả về hàm Main Tại hàm Main cũng không có, nên CLR sẽ gọi trình mặc định xử lý ngoại lệ, việc này... public void Func2() { Console.WriteLine(“Enter Func2 ”); try { Console.WriteLine(“Entering try block ”); throw new System.Exception(); Console.WriteLine(“Exiting try block ”); } 368 Xử Lý Ngoại Lệ Ngôn Ngữ Lập Trình C# catch { Console.WriteLine(“Exception caught and handled.”); } Console.WriteLine(“Exit Func2 ”); } } } Kết quả: Enter Main Enter Func1 Enter Func2 . C# và chúng không phải là một bộ phận c a ngôn ngữ C# . Những lớp này c n đư c sử dụng tốt bởi những ngôn ngữ kh c C#. Ngoài ra lớp BinaryReader c n c những phương th c kh c để th c hiện vi c. ngôn ngữ này c thể đư c sử dụng bởi một ngôn ngữ kh c. C u hỏi 2: Nếu muốn tìm hiểu về c c lớp đư c cung c p bởi .NET một c ch chi tiết thì phải tìm ở đâu? Trả lời 2: Để tìm hiểu chi tiết c c lớp. c a lớp này hay không? C u hỏi 5: Lớp thao t c tập tin File chứa trong namespace nào? C c thao t c chính đư c th c hiện trên tập tin? C u hỏi 6: Lớp nào cung c p c c thông tin về tập tin? C c