Danh mục

Những chủ đề tiến bộ trong C# - Delegate – Phần 1

Số trang: 14      Loại file: pdf      Dung lượng: 118.55 KB      Lượt xem: 13      Lượt tải: 0    
Thu Hiền

Hỗ trợ phí lưu trữ khi tải xuống: 4,000 VND Tải xuống file đầy đủ (14 trang) 0
Xem trước 2 trang đầu tiên của tài liệu này:

Thông tin tài liệu:

Delegate có thể được xem như là kiểu đối tượng mới trong C#, mà có môt số điểm quen thuộc với lớp.chúng tồn tại trong tình huống mà ta muốn truyền phương thức xung quanh những phương thức khác.để minh hoạ ta xem dòng mã sau: int i = int.Parse("99"); Chúng ta quen với việc truyền dữ liệu đến một phương thức như là thông số,vì vậy ý tường truyền phương thức như là thông số nghe có vẻ hơi lạ đối với chúng ta.tuy nhiên có trường hợp mà ta có 1 phương thức mà làm 1 điều...
Nội dung trích xuất từ tài liệu:
Những chủ đề tiến bộ trong C# - Delegate – Phần 1 Những chủ đề tiến bộ trong C# Delegate – Phần 1Delegate có thể được xem như là kiểu đối tượng mới trong C#, mà có môt sốđiểm quen thuộc với lớp.chúng tồn tại trong tình huống mà ta muốn truyềnphương thức xung quanh những phương thức khác.để minh hoạ ta xem dòngmã sau:int i = int.Parse(99);Chúng ta quen với việc truyền dữ liệu đến một phương thức như là thôngsố,vì vậy ý tường truyền phương thức như là thông số nghe có vẻ hơi lạ đốivới chúng ta.tuy nhiên có trường hợp mà ta có 1 phương thức mà làm 1 điềugì đó, nhiều hơn là xử lí dữ liệu, phương thức đó có thể cần làm điều gì đómà liên quan đến việc thực thi phương thức khác.phức tạp hơn, bạn khôngbiết vào lúc nào thì phương thức thứ hai sẽ được biên dịch. thông tin đó chỉbiết vào lúc chạy , và chính vì lí do đó mà phương thức 2 sẽ cần truyền vàonhư là thông số cho phương thức đầu tiên.điều này nghe có vẻ hơi khóhiểu,nhưng nó sẽ được làm rõ hơn trong 1 vài ví dụ sau:Luồng bắt đầu: C# có thể bảo máy tính bắt đầu một chuỗi thực thi mới songsong với việc thực thi đương thời.1 chuỗi liên tiếp này gọi là luồng,và việcbắt đầu này được làm bằng cách dùng phương thức, Start() trên 1 thể hiệncủa lớp cơ sở.System.Threading.Thread. ( chi tiết hơn về luồng ở chương5).khi chương trình bắt đầu chạy,nơi nó bắt đầu là main(). tương tự như vậykhi bạn muốn máy tính chạy một chuỗi thực thi thì bạn phải báo cho máytính biết bắt đầu chạy là ở đâu. bạn phải cung cấp cho nó chi tiết của phươngthức mà việc thực thi có thể bắt đầu.-nói cách khác , phương thứcThread.Start() phải lấy 1 thông số mà định nghĩa phương thức được thi hànhbởi luồng.Lớp thư viện chung . khi 1 nhiệm vụ chứa đựng nhiệm vụ con mà mã củacác nhiệm vụ con này được viết trong các thư viện chỉ có sử dụng thư việnmới biết nó làm gì.ví dụ , chúng ta muốn viết một lớp chứa một mảng đốituợng và sắp nó tăng dần. 1 phần công việc được lặp lại là lấy 2 đối tượngtrong lớp so sánh với nhau để xem đối tượng nào đứng truớc.nếu ta muốnlớp có khả năng sắp xếp bất kì đối tượng nào, không có cách nào có thể làmđược việc so sánh trên .mã client dùng mảng đối tượng của ta sẽ bảo cho tabiết cách so sánh cụ thể đối tượng mà nó muốn sắp xếp.nói cách khác , mãclient sẽ phải truyền cho lớp của ta phương thức thích hợp mà có thể đượcgọi, để làm việc so sánh.Nguyên tắc chung là: mã của ta sẽ cần thông báo cho thời gian chạy .NETbiết phương thức nào xử lí tình huống nào.Vì thế chúng ta phải thiết lập những nguyên tắc mà đôi lúc , những phươngthức cần lấy chi tiết của phương thức khác như là thông số.kế tiếp chúng tasẽ minh họa cách làm điều đó.cách đơn giản nhất là truyền tên của phươngthức như là thông số.giả sử chúng ta muốn bắt đầu một luồng mới, và chúngta có phương thức được gọi là entrypoint(), mà ta muốn luồng bắt đầu chạytừ đó:void EntryPoint(){// làm những gì luồng mới cần làm}Có thể chúng ta bắt đầu luồng mới với một đoạn mã :Thread NewThread = new Thread();Thread.Start(EntryPoint); // saiThật sự đây là cách đơn giản nhất. trong một vài ngôn ngữ dùng cách nàynhư c và c++ ( trong c và c++ thông số entrypoint là con trỏ hàm)Không may, cách thực thi trực tiếp này gây ra một số vấn đề về an toànkiểu.nhớ rằng ta đang lập trình hướng đôí tượng, phương thức hiếm khi nàotồn tại độc lập , mà thường là phải kết hợp với phương thức khác trưóc khiđược gọi.vì vậy .NET không cho làm điều này.thay vào đó nếu ta muốntruyền phương thức ta phải gói chi tiết của phương thức trong một loại đốitượng mới là 1 delegate. delegate đơn giản là một kiểu đối tượng đặc biệt-đặc biệt ở chổ ,trong khi tất cả đối tượng chúng ta định nghĩa trước đây chứađựng dữ liệu , thì delegate chứa đựng chi tiết của phương thức.Dùng delegate trong C#Đầu tiên ta phải định nghĩa delegate mà ta muốn dùng ,nghĩa là bảo chotrình biên dịch biết loại phương thức mà delegate sẽ trình bày.sau đó ta tạora các thể hiện của delegate.Cú phápdelegate void VoidOperation(uint x);Ta chỉ định mỗi thể hiện của delegate có thể giữ một tham chiếu đến 1phương thức mà chứa một thông số uint và trả vầ kiểu void.Ví dụ khác : nếu bạn muốn định nghĩa 1 delegate gọi là twolongsOp màtrình bày 1 hàm có 2 thông số kiểu long và trả về kiểu double. ta có thể viết :delegate double TwoLongsOp(long first, long second);Hay 1 delegate trình bày phương thức không nhận thông số và trả về kiểustringdelegate string GetAString();Cú pháp cũng giống như phương thức , ngoại trừ việc không có phần thâncủa phương thức,và bắt đầu với delegate.ta cũng có thể áp dụng các cáchthức truy nhập thông thường trên một định nghĩa delegate -public,private,protected ...public delegate string GetAString();Mỗi lần ta định nghĩa một delegate chúng ta có thể tạo ra một thể hiện củanó mà ta có thể dùng đề lưu trữ các chi tiết của 1 phưong thức cụ thể ...

Tài liệu được xem nhiều: