Trang chủ

Lập Trình Hướng Đối Tượng với C#

Trang chủCông nghệ | February 13, 2014

 

Lập Trình Hướng Đối Tượng

 

I.        Lập trình hướng đối tượng

  1. 1.   Các phương pháp lập trình

–          Chương trình là gì?

–          Chương trình bao gồm những thành phần nào?

chương trình là gì ?

chương trình là gì ?

  1. a.   Phương pháp lập trình hướng lệnh


.

 

  1. b.   Phương pháp lập trình hướng thủ tục và hàm

 

 

 

 

  1. c.    Phương pháp lập trình hướng đối tượng

–          Dữ liệu (thuộc tính) chứa các thông tin của đối tượng

–          Hành động (phương thức): là các hàm hay thủ tục xử lý của đối tượng đó.

Những đặc điểm của lập trình hướng đối tượng là:

–          Sự đóng gói

–          Kế thừa

–          Tính đa hình

  • Sự đóng gói

Đóng gói là sự gom chung lại của dữ liệu và những thao tác xử lý của dữ liệu đó. Mục đích của sự đóng gói dữ liệu là che giấu thông tin, là khả năng giấu dữ liệu bên trong đối tượng khỏi người dùng và chỉ cung cấp cho người dùng truy cập đến dữ liệu bên trong thông qua một giao diện. Đóng gói còn tạo sự đồng nhất giữa dữ liệu và các thao tác tác động lên dữ liệu đó.

.

  • Kế thừa

Kế thừa là sự sử dụng lại những kết quả đã có để phát triển thêm.

  • Tính đa hình

Là khả năng linh động của lập trình hướng đối tượng, nó cho phép ta tạo ra những phương thức thông minh. 
Lớp và thực thể

Lớp là trung tâm của mỗi ngôn ngữ lập trình hướng đối tượng. Lớp là sự đóng gói  dữ liệu và phương thức làm việc trên dữ liệu đó.

  1. 2.   Khái niệm lớp

                                           class Employee

{

private long employeeID;

}

Lớp này là lớp cơ sở, chứa một thành phần có tên là employeeID.

 

  1. 3.   Thực thể

                   Ví dụ:           Employee emp = new Employee();

thì emp là một thực thể của đối tượng Employee

  1. 4.   Thành phần của lớp

         Lớp gồm có các thành phần sau:

  • Fields (trường): .
  • Method (phương thức): .
  • Properties (thuộc tính): .
  • Constants (hằng): .
  • Events (sự kiện): một sự kiện là điều gì đó làm cho một số phần code thi hành. Sự kiện là phần tích hợp của lập trình Microsoft Windows. Ví dụ một sự kiện phát sinh khi di chuyển chuột hoặc một cửa sổ được nhấn vào hay bị thay đổi kích thước, v.v….
  • Operators (toán tử.
  1. 5.   Bổ từ truy cập (Access Modifiers)

        

Bổ từ truy cập

Mô tả

public Báo hiệu rằng thành phần có thể được truy cập từ bên ngoài định nghĩa lớp và từ hệ thống phân cấp của các lớp dẫn xuất (lớp con).
protected Thành phần không thể truy cập từ bên ngoài lớp và chỉ có thể truy cập được từ các lớp con.
private Thành phần không thể truy cập được từ bên ngoài phạm vi của lớp, lớp con cũng không có quyền truy cập đến thành phần này.
internal Thành phần chỉ thấy được bên trong đơn vị biện dịch hiện hành. Bổ từ truy cập ineternal tạo một chức năng kết hợp của publicprotected tuỳ thuộc vào nơi xuất hiện của code.

Lưu ý: trừ phi bạn muốn một thành phần có bổ từ truy cập mặc định là private, bạn phải chỉ rõ bổ từ truy cập trước mỗi thành phần. Do vậy, nếu bạn nào đã từng lập trình với C++ thì sẽ thấy nó khác.

Dưới đây là một ví dụ mô tả sự khác biệt giữa C# và C++

Đối với ngôn ngữ C++:

class AccessModsInCpp{

public:

int a;

int b;

int c;

protected:

int d;

int e;

}

Đối với ngôn ngữ C-Sharp:

class AccessModsInCSharp{

public int a;

public int b;

public int c;

protected int d;

protected in e;

}

 

  1. 6.   Phương thức Main

                     Trong lập trình ứng dụng, mặc dù có thể đặt phương thức Main ở bât kỳ lớp nào, bạn nên tạo một lớp riêng biệt chỉ để đặt phương thức Main. Sau đây là một ví dụ đơn giản Employee:

class Employee

{

private int employeeID;

}

class AppClass

{

Employee emp = new Employee();

}

  1. 7.   Phương thức khởi tạo (constructor)

         Trong ngôn ngữ OOP, bạn có thể định nghĩa một phương thức đặc biệt mà chúng luôn được gọi bất cứ khi nào một thể hiện (instance) của lớp được tạo ra. Những phương thức này được gọi là constructor.

using System;

class Constructor1App

{

Constructor1App()

{

Console.Writeline(“I’m the constructor.”);

}

public static void Main()

{

Constructor1App app = new Constructor1App();

}

}

Lưu ý: Các constructor không trả về giá trị.

Trong C#, để khởi tạo một đối tượng, bạn luôn phải sử dụng từ  khoá new.

<class> <object> = new <class>(constructor arguments)

  1. 8.   Hằng và trường Read-Only

         .

c)   Hằng (constant)

     Để định nghĩa một trường như một hằng, dùng từ khoá const đứng trước thành phần được định nghĩa như sau:

using System;

class MagicNumbers

{

public const double pi = 3.1415;

}

 

d)   Trường read-only

     :

using System;

class GraphicsPackage

{

public readonly int ScreenWidth;

public readonly int ScreenHeight;

public GraphicsPackage()

{

this.ScreenWidth = 1024;

this.ScreenHeight = 768;

}

}

  1. 9.   Kế thừa

       

–          Một lớp chung là lớp nhân viên NhanVien (lớp cơ sở).

–          Một lớp cho nhân viên hành chánh NhanVienHC kế thừa lớp nhân viên.

–          Một lớp cho nhân viên sản xuất NhanVienSX cũng kế thừa lớp nhân viên.

Lúc này, do kế thừa nên trong lớp NhanVienHC và lớp NhanVienSX ta không cần phải khai báo các thông tin về nhân viên nữa mà chỉ khai báo các thông tin riêng của từng bộ phận mà thôi.

Để kế thừa một lớp từ một lớp khác, ta dùng cú pháp như sau:

class <derivedClass>:<baseClass>

Ví dụ:

using System;

 

class NhanVien

{

protected string Ho;

protected string Ten;

protected int Tuoi;

protected double Luong;

 

public NhanVien(string Ho, string Ten, int Tuoi, double Luong)

{

this.Ho = Ho;

this.Ten = Ten;

this.Tuoi = Tuoi;

this.Luong = Luong;

}

            }

 

class NhanVienHC : NhanVien

{

}

 

class NhanVienSX : NhanVien

{

}

 


II.     Phương Thức (method)

  1. 1.   Cách gọi một phương thức

Ta hãy xét ví dụ sau

Ví dụ: Ta có một lớp nhân viên và phương thức TinhLuong như sau:

 

using System;

 

class NhanVien

{

protected string Ho;

protected string Ten;

protected int Tuoi;

protected double Luong;

 

public NhanVien(string Ho, string Ten, int Tuoi, double Luong)

{

this.Ho = Ho;

this.Ten = Ten;

this.Tuoi = Tuoi;

this.Luong = Luong;

}

 

public double TinhLuong (int GioLam)

{

//Tinh luong

return (Luong * (double)GioLam);

}

}

 

class EmployeeApp

{

public static void Main()

{

            NhanVien emp = new NhanVien(“Cao Hoang”, “Phuc”, 27, 40);

 

//Gọi tới phương thức tính lương

            Console.WriteLine(“Luong cua Phuc la ” + emp.TinhLuong(40));

       

Console.ReadLine();

}

}

 

Để gọi một phương thức của một đối tượng, trước hết ta phải tạo một thể hiện  (instance) của một đối tượng đó bằng từ khoá new,

NhanVien emp = new NhanVien(“Cao Hoang”, “Phuc”, 27, 40);

sau đó dùng tên instance vừa tạo vào dấu chấm (.) rồi phương thức đó.

emp.TinhLuong(40)

 

 

 

  1. 2.   Tham số phương thức Ref và Out

         

Tuy nhiên có sự khác biệt giữa ref và out:

–          Với từ khoá out, các đối số truyền không cần phải khai báo.

// cs_out.cs

using System;

public class MyClass

{

public static int TestOut(out char i)

{

i = ‘b’;

return 1;

}

public static void Main()

{

//biến i không cần được khai báo.

Console.WriteLine(TestOut(out i));

Console.WriteLine(i);

}

}

–          Với từ khoá ref, các đối số truyền cần phải được khai báo.

// cs_ref.cs

using System;

public class MyClass

{

public static void TestRef(ref char i)

{

// The value of i will be changed in the calling method

i = ‘b’;

}

public static void TestNoRef(char i)

{

// The value of i will be unchanged in the calling method

i = ‘c’;

}

public static void Main()

{

                  char i = ‘a’;    // biến truyền bắt buộc phải khai báo

TestRef(ref i);  // dùng từ khoá ref để truyền tham biến

                  Console.WriteLine(i);

TestNoRef(i);

                  Console.WriteLine(i);

                 Console.ReadLine();

}

}

  1. 3.   Nạp chồng phương thức (Overloading)

Nạp chồng phương thức cho phép lập trình viên C# sử dụng cùng tên phương thức nhiều lần mà chỉ khác đối số truyền.

.

 

using System;

 

class NhanVien

{

protected string Ho;

protected string Ten;

protected int Tuoi;

protected double Luong;

 

public NhanVien(string Ho, string Ten, int Tuoi, double Luong)

{

this.Ho = Ho;

this.Ten = Ten;

this.Tuoi = Tuoi;

this.Luong = Luong;

}

 

public double TinhLuong (int GioTrongTuan)

{

//Tinh luong

return (Luong * (double)GioTrongTuan);

}

public double TinhLuong (string NgayTrongThang)

{

//Tinh luong

return (Luong * Convert.ToDouble(gayTrongThang));

}

}

 

class EmployeeApp

{

public static void Main()

{

                  NhanVien emp = new NhanVien(“Cao Hoang”, “Phuc”, 27, 40);

 

//Gọi tới phương thức tính lương theo kiểu int

                  Console.WriteLine(“Luong cua Phuc la ” + emp.TinhLuong(40));

           

//Gọi tới phương thức tính lương theo kiểu string

                  Console.WriteLine(“Luong cua Phuc la ” + emp.TinhLuong(“26”));

 

Console.ReadLine();

}

}

//////////////////////////////////////////.

using System;

 

class NhanVien

{

protected string Ho;

protected string Ten;

protected int Tuoi;

protected double Luong;

 

public NhanVien(string Ho, string Ten, int Tuoi)

{

this.Ho = Ho;

this.Ten = Ten;

this.Tuoi = Tuoi;

}

 

public NhanVien(string Ho, string Ten, int Tuoi, double Luong)

{

this.Ho = Ho;

this.Ten = Ten;

this.Tuoi = Tuoi;

this.Luong = Luong;

}

 

public double TinhLuong (int GioTrongTuan)

{

//Tinh luong

return (Luong * (double)GioTrongTuan);

}

public double TinhLuong (string NgayTrongThang)

{

//Tinh luong

return (Luong * Convert.ToDouble(ngayTrongThang));

}

}

 

class OverLoadEmployeeApp

{

public static void Main()

{

                  NhanVien emp = new NhanVien(“Cao Hoang”, “Phuc”, 27);

 

//Gọi tới phương thức tính lương theo kiểu int

                  Console.WriteLine(“Luong cua Phuc la ” + emp.TinhLuong(40));

           

//Gọi tới phương thức tính lương theo kiểu string

                  Console.WriteLine(“Luong cua Phuc la ” + emp.TinhLuong(“26”));

 

Console.ReadLine();

}

}

.

 

 

 

 

  1. 4.   Tham số biến của phương thức

using System;

 

class Point

{

public int x;

public int y;

     

public Point(int x, int y)

{

this.x = x;

                  this.y = y;

}

}

 

class Chart

{

            public void DrawLine(params Point[] p)

{

                  Console.WriteLine(“Phuong thuc nay se in ra cac diem”);

for (int i=0; i<p.Length; i++)

{

                        Console.WriteLine(“{0},{1}”, p[i].x, p[i].y);

}

}

}

 

class ParamsApp

{

public static void Main()

{

Point p1 = new Point(5,10);

                  Point p2 = new Point(5,15);

Point p3 = new Point(5,20);

     

Chart chart = new Chart();

chart.DrawLine(p1,p2,p3);

                  Console.ReadLine();

}

}

.

  1. 5.   Phương thức ảo

                   Ta giả sử hàm tính lương của ta chỉ gồm một câu xuất thông báo ra màn hình, ta hãy xét ví dụ sau:

 

    using System;

 

class NhanVien

{

protected string Ten;

 

public NhanVien(string Ten)

{

this.Ten = Ten;

}

virtual public void TinhLuong ()

{

Console.WriteLine(“NhanVien.TinhLuong duoc goi boi {0}”,ten);

}

}

 

    //Nhan vien thoi vu

    class NhanVienTV : NhanVien{

        public NhanVienTV(string ten):base(ten){

}

        override public void TinhLuong(){

            Console.WriteLine(“NhanVienTV.TinhLuong duoc goi boi {0}”, ten);

}

}

 

//Nhan vien hop dong

class NhanVienHD : NhanVien{

        public NhanVienHD(string ten):base(ten){

}

override public void TinhLuong(){

            Console.WriteLine(“NhanVienHD.TinhLuong duoc goi boi {0}”, ten);

}

}

class NhanVienApp

{

    protected NhanVien[] nhanvien;

 

        public void LoadNV(){

            nhanvien = new NhanVien[2];

nhanvien[0] = new NhanVienTV(“Phuc”);

            nhanvien[1] = new NhanVienHD(“Hoa”);

}

   

        public void TraLuong(){

foreach (NhanVien nv in nhanvien)

                nv.TinhLuong();

}

   

public static void Main()

{

            NhanVienApp emp = new NhanVienApp();

            emp.LoadNV();

            emp.TraLuong();

}

}

Kết quả:

NhanVienTV.TinhLuong duoc goi boi Phuc

NhanVienHD.TinhLuong duoc goi boi Hoa

Lưu ý: Các phương thức ảo không được khai báo private bởi vì, bằng định nghĩa, chúng sẽ không thể được nhìn thấy trong lớp dẫn xuất.

 


III.   Thuộc tính (Properties)

Một lớp được thiết kế tốt không chỉ che dấu phần cài đặt của phương thức mà còn không cho phép bất kỳ một sự truy cập trực tiếp đến các trường (field) của lớp. Bằng cách cung cấp các phương thức truy cập, là các phương thức có nhiệm vụ lấy và gán giá trị cho trường, bạn được bảo đảm trường được truy cập một cách đúng đắn.

Ví dụ, giả sự bạn có một lớp Address, với trường Zipcode và trường City, khi một đoạn mã sử dụng lớp Address thay đổi trường Address.Zipcode, bạn muốn xác nhận Zipcode có trong csdl không và tự động gán trường Address.City dựa trên Zipcode đó. Nếu đoạn mã đó có quyển truy cập trực tiếp vào thành phần public Address.Zipcode, không có cách nào dễ dàng để thực hiện những điều này vì việc thay đổi một biến thành phần một cách trực tiếp không đòi hỏi một phương thức. Vì thế, thay vì gán quyền truy cập trực tiếp cho trường Address.Zipcode, cách thiết kế tốt hơn là định nghĩa hai trường Address.ZipcodeAddress.Cityprotected và cung cấp một phương thức truy cập để lấy và gán giá trị cho trường Address.Zipcode. Theo cách này bạn có thể gắn kèm thêm một đoạn code vào các phương thức này để thực hiện bất kỳ công việc phụ nào cần làm.

Ví dụ trên đây được minh hoạ bằng C# dưới đây. Lưu ý rằng trường Zipcode được định nghĩa là protected và vì thế không thể truy cập từ bên ngoài, còn các phương thức truy xuất GetZipCodeSetZipCode được định nghĩa là public.

class Address{

    protected string Zipcode;

    protected string City;

       

public string GetZipCode(){

                return this.Zipcode;

}

            public void SetZipCode(string Zipcode){

this.Zipcode = zipcode;

}

}

Code bên ngoài truy cập tới giá trị Address.Zipcode như sau:

Address addr = new Address();

addr.SetZipCode(“12345”);

string zip = addr.GetZipCode();

 

.

Ví dụ trên được viết lại như sau:

 

class Address{

    protected string Zipcode;

    protected string City;

 

public string ZipCode{

                get{

                    return Zipcode;

}

                set{

                    Zipcode = value;

}

}

}

Bây giờ, properties Address.ZipCode đã được cài đặt xong, sau đây là cách code bên ngoài lớp sử dụng property này:

Address addr = new Address();

addr.ZipCode = “12345”;

string zip = addr.ZipCode;

Như thế, code ở bên ngoài truy cập đến các trường rất dễ: bạn không phải di chuyển lên phần định nghĩa lớp để xem trường đó là public hay không và cũng không cần phải biết tên phương thức truy cập là gì.

 


IV.    Interface

C# không hỗ trợ đa kế thừa (kế thừa bội), nên không có cách nào để một lớp cho dẫn xuất từ nhiều lớp. Chỉ có interface mới có thể làm điều đó. Interface cho phép bạn định nghĩa một tập các phương thức và thuộc tính liên quan mà lớp được chọn có thể thi hành mà không quan tâm đến hệ thống phân cấp của lớp. Khi một interface được định nghĩa và một lớp được định nghĩa như là cài đặt interface đó, thì các client (người dùng code) của lớp được bảo đảm răng lớp đã cài đặt tất cả các phương thức được định nghĩa trong interface.

  1. 1.   Khai báo interface

Interface có thể chứa phương thức, property, indexerevent – không có thành phần nào được cài đặt trong chính interface đó. Dưới đây là một interface đơn giản chứa một phương thức đơn tên Validate:

interface IValidate{

bool Validate()

}

Bạn không cần phải chỉ định một bổ từ truy cập chẳng hạn như public cho một thành phần interface. Thật ra, khi dùng bổ từ truy cập cho khai báo phương thức sẽ gây ra lỗi khi biên dịch bởi vì tất cả các phương thức interface mặc định là public.

Trong phần thực hành, các bạn sẽ thấy rõ được vấn đề này.

 


V.       Xử lý ngoại lệ

Một trong những mục đích chính của môi trường thực thi ngôn ngữ chung .Net là tránh các lỗi runtime (thông qua các đặc tính chảng hạn như quản lý tài nguyên và bộ nhớ một cách tự động khi dùng code được quản lý (managed code) hoặc ít nhất cũng bắt được các lỗi lúc biên dịch (bằng một hệ thống định kiểu mạnh mẽ). Tuy nhiên, có một số lỗi chỉ có thể bắt được lúc thực thi, và vì thế một biện pháp phù hợp liên quan đến xử lý lỗi phải được dùng thông qua tất cả ngôn ngữ.

  1. 1.   Tổng quan về xử lý ngoại lệ

Ngoại lệ (exception) là điều kiện lỗi phát sinh khi luồng bình thường của một đường dẫn code (code path) không có hoặc thực thi không chính xác. Cần phải hiểu rõ sử khác biệt giữa một ngoại lệ và một sự kiện không mong đợi (chẳng hạn như sự kiện chạm đến cuối tập tin). Nếu bạn có một phương thức đang đọc tập tin tuần tự, bạn biết rằng lúc nào đó sẽ chạm đến cuối tập tin. Vì thế, sự kiện này là một ngoại lệ đặc biệt có tính tự nhiên mà không ngăn cản ứng dụng chấm dứt hoạt động. Tuy nhiên, nếu bạn đang đọc một tập tin và hệ điều hành cảnh báo rằng đã tìm thấy lỗi trên đĩa, thì đây là một điều kiện ngoại lệ chắc chắn và rõ ràng nó sẽ ảnh hưởng đến luồng bình thường của phương thức đang cố gắng tiếp tục đọc tập tin.

public void Foo(string filename)

{

File file = OpenFile(filename);

while (!file.IsEOF())

{

string record = file.ReadRecord();

}

CloseFile();

}

public void OpenFile(string filename)

{

//Cố gắng khoá và mở tập tin

}

 

Lưu ý rằng nếu phương thức OpenFile lỗi, nó không thể xử lý lỗi. Đó là vì nó không chịu trách nhiệm mở tập tin. Nó không thể xác định xem việc hông thể mở tập tin sẽ tạo ra lỗi nghiêm trọng hay một lỗi nhẹ. Vì thế, OpenFile không thể xử lý lỗi bởi vì phương thức được xem là không đúng ngữ cảnh.

  1. 2.   Cơ bản về ngoại lệ – cú pháp xử lý

Phương pháp xử lý ngoại lệ chỉ bao gồm 4 từ khóa: try, catch, throwfinally. Cách những từ khoá này làm việc rất đơn giản và suôn sẻ. Khi một phương thức không đạt được mục tiêu của nó và không thể tiếp tục – đó là khi nó dò thấy một ngoại lệ – nó sẽ ném ra một ngoại lệ cho phương thức gọi bằng cách dùng từ khoá throw (ném). Phương thức gọi sau đó nhận ngoại lệ được ném ra này và bắt nó thông qua từ khoá catch.

  1. a.   Ném một ngoại lệ

Khi một phương thức cần thông báo cho phương thức gọi rằng có một lỗi xảy ra, nó dùng từ khoá throw theo cách sau:

throw statement;

throw exception;

Khi bạn ném một ngoại lệ thì bạn được yêu cầu ném một đối tượng thuộc kiểu System.Exception. Sau đây là một ví dụ về một phương thức xác định rằng lỗi không thể phục hồi đã xảy ra và nó cần ném một ngoại lệ cho phương thức gọi.

public void SomeMethod()

{

//Một số lỗi được xác định

throw new Exception();

}

 

  1. b.   Bắt một ngoại lệ

.

public void Foo(string filename)

{

try

{

File file = OpenFile(filename);

}

catch(Exception e)

{

//Xử lý lỗi

}

while (!file.IsEOF())

{

string record = file.ReadRecord();

}

CloseFile();

}

public void OpenFile(string filename)

{

//Cố gắng khoá và mở tập tin

}

}

 

  1. c.    Ném lại một ngoại lệ

Sau khi phương thức đã bắt ngoại lệ và thực hiện mọi thứ có thể trong ngữ cảnh của nó, nó có thể ném lại ngoại lệ vừa mới bắt này về phương thức gọi nó.

 

using System;

class RethrowApp

{

static public void Main()

{

RethrowApp rethrow = new RethrowApp();

try

{

rethrow.Foo();

}

catch(Exception e)

{

Console.WriteLine(e.Message);

}

}

public void Foo()

{

try

{

Bar();

}

catch(Exception)

{

//Tiếp tục ném trả về phương thức gọi

throw;

}

}

public void Bar()

{

//Có lỗi

throw new Exception(“throw by Rethrow.Bar”);

}

Trong ví dụ này, Main gọi Foo, Foo gọi Bar. Bar ném ra một ngoại lệ và Foo sẽ bắt. Foo thực hiện một số xử lý và ném tiếp trả ra cho Main bằng từ khoá throw.

 

  1. d.   Thu dọn với finally

.

 

using System;

 

public class ThrowExceptionApp

{

public static void ThrowException()

{

throw new Exception();

}

public static void Main()

{

try

{

Console.WriteLine(“try…”);

}

catch(Exception e)

{

Console.WriteLine(“catch…”);

}

finally

{

Console.WriteLine(“finally”);

}

}

}

 

Bạn xem, việc sử dụng từ khoá finally giúp bạn khỏi phải mất công đặt code thu dọn trong cả hai khối là try và catch. Bây giờ cho dù ngoại lệ có được ném ra hay không thì code trong khối finally vẫn được thực thi.

 

  1. e.   Ném ngoại lệ từ Constructor

try

{

//Nếu đối tượng AccessDatabase thất bại

//đối với việc khởi tạo và ném ra một ngoại lệ

//ngoại lệ sẽ được bắt

AccessDatabase accessDb = new AccessDatabase();

}

catch(Exception e)

{

//Xử lý ngoại lệ bắt được

}

 

  1. f.     Bắt nhiều ngoại lệ

.

public void Foo(string filename)

{

try

{

File file = OpenFile(filename);

}

catch(FileNotFoundException fnf)

{

//Xử lý lỗi khi không tìm thấy file

}

catch(FileLoadException fle)

{

//Xử lý lỗi khi không mở được file

}

catch(Exception e)

{

//Xử lý các lỗi khác ngoài 2 lỗi trên

}

}

public void OpenFile(string filename)

{

//Cố gắng khoá và mở tập tin

}

.

public void Foo(string filename)

{

try

{

File file = OpenFile(filename);

}

catch(Exception e)

{

//Chương trình sẽ nhảy vào đây và thoát

}

catch(FileNotFoundException fnf)

{

//Xử lý lỗi khi không tìm thấy file

}

catch(FileLoadException fle)

{

//Xử lý lỗi khi không mở được file

}

}

public void OpenFile(string filename)

{

//Cố gắng khoá và mở tập tin

}

 

  1. g.   Dẫn xuất lớp Exception của chính bạn

.

 

using System;

 

public class ThrowExceptionApp

{

public static void ThrowException()

{

throw new Exception();

}

 

 

public static void Main()

{

try

{

Console.WriteLine(“try…”);

}

catch(Exception e)

{

Console.WriteLine(“catch…”);

}

finally

{

Console.WriteLine(“finally”);

}

}

}

public class TestException: Exception

{

//Bạn có thể thêm vào những phuơng thức và thuộc tính

//ở đây để bổ sung cho Exception mà bạn dẫn xuất từ nó.

 

//Các constructors của lớp cơ sở Exception

public TestException():base()

{

}

public TestException(string message):base(message)

{

}

public TestException(string message, Exception innerException)

:base(message, innerException)

{

}

}

public class DerivedExceptionTestApp

{

public static void ThrowException()

{

throw new TestException(“Error condition”);

}

public static void Main()

{

try

{

ThrowException();

}

catch(Exception e)

{

Console.WriteLine(e.ToString());

}

}

}

 


 


VI.Viết một

 

 

Xem thêm:

Gửi bình luận

Xem thêm

Thời trang

Xem thêm

Công nghệ

Link hữu ích
shop bán váy đầm công chúa đẹp tại TP.HCM

shop bán đầm cho bé gái đẹp tại TP.HCM
shop bán Thời trang trẻ em cao cấp giao hàng toàn quốc
mua mùn cưa giá cao
váy đầm công chúa

váy đầm trẻ em | mua24h.com.vn |

Tuyển chuyên viên thiết kế và may đầm công chúa giỏi :
Cung cấp vải sỉ và lẻ