Trang chủ
Bài viết mới
Diễn đàn
Bài mới trên hồ sơ
Hoạt động mới nhất
VIDEO
Mùa Tết
Văn Học Trẻ
Văn Học News
Media
New media
New comments
Search media
Đại Học
Đại cương
Chuyên ngành
Triết học
Kinh tế
KHXH & NV
Công nghệ thông tin
Khoa học kĩ thuật
Luận văn, tiểu luận
Phổ Thông
Lớp 12
Ngữ văn 12
Lớp 11
Ngữ văn 11
Lớp 10
Ngữ văn 10
LỚP 9
Ngữ văn 9
Lớp 8
Ngữ văn 8
Lớp 7
Ngữ văn 7
Lớp 6
Ngữ văn 6
Tiểu học
Thành viên
Thành viên trực tuyến
Bài mới trên hồ sơ
Tìm trong hồ sơ cá nhân
Credits
Transactions
Xu: 0
Đăng nhập
Đăng ký
Có gì mới?
Tìm kiếm
Tìm kiếm
Chỉ tìm trong tiêu đề
Bởi:
Hoạt động mới nhất
Đăng ký
Menu
Đăng nhập
Đăng ký
Install the app
Cài đặt
Chào mừng Bạn tham gia Diễn Đàn VNKienThuc.com -
Định hướng Forum
Kiến Thức
- HÃY TẠO CHỦ ĐỀ KIẾN THỨC HỮU ÍCH VÀ CÙNG NHAU THẢO LUẬN Kết nối:
VNK X
-
VNK groups
| Nhà Tài Trợ:
BhnongFood X
-
Bhnong groups
-
Đặt mua Bánh Bhnong
CÔNG NGHỆ
Công Nghệ Thông Tin
Code
Tìm hiểu về Delegate trong C#
JavaScript is disabled. For a better experience, please enable JavaScript in your browser before proceeding.
You are using an out of date browser. It may not display this or other websites correctly.
You should upgrade or use an
alternative browser
.
Trả lời chủ đề
Nội dung
<blockquote data-quote="Hoàng Xuân Bách" data-source="post: 181255" data-attributes="member: 315148"><p><span style="font-size: 18px">Một delegate giống như một “người đại diện” hay “đại sứ”. Một delegate có thể được dùng để tạo một bao đóng (encapsulation) cho bất kì phương thức nào, miễn là nó phù hợp (kiểu trả về, tham số). Là một “đại sứ”, delegate có thể triệu gọi phương thức bất kì nơi nào: từ đối tượng này đến đối tượng kia, từ thread này sang thread kia,… Đây là đặc điểm chính của delegate, bạn sẽ cần nhớ lại điều này khi giải quyết các vấn đề thường gặp như truyền dữ liệu giữa hai Form, xử lý lỗi “Cross-thread operation not valid”, tạo event, … Ta sẽ học cách sử dụng delegate qua 3 bước</span><strong><span style="font-size: 18px">:</span></strong></p><p></p><ul> <li data-xf-list-type="ul"><span style="font-size: 18px"> Khai báo</span></li> <li data-xf-list-type="ul"><span style="font-size: 18px"> Khởi tạo</span></li> <li data-xf-list-type="ul"><span style="font-size: 18px">Thực thi</span></li> </ul><p><span style="font-size: 18px"><strong>Khai báo</strong></span></p><p><span style="font-size: 18px">Là một đại diện của phương thức và là một kiểu dữ liệu, cách khai báo delegate giống như một sự kết hợp giữa khai báo đối tượng và phương thức. Một delegate được khai báo theo cú pháp sau:</span></p><p></p><p><span style="font-size: 18px">[modifier] delegate return-type Identifier ([formal-parameters])</span></p><p></p><p><span style="font-size: 18px">Trong đó:</span></p><p></p><ul> <li data-xf-list-type="ul"><span style="font-size: 18px">modifier: phạm vi truy xuất (public, private, protected, internal)</span></li> <li data-xf-list-type="ul"><span style="font-size: 18px">delegate: từ khóa</span></li> <li data-xf-list-type="ul"><span style="font-size: 18px">return-type: kiểu dữ liệu trả về</span></li> <li data-xf-list-type="ul"><span style="font-size: 18px">Identifier: định danh của delegate</span></li> <li data-xf-list-type="ul"><span style="font-size: 18px">formal-parameters: danh sách các tham số hình thức</span></li> </ul><p><span style="font-size: 18px">Các phần trong cặp ngoặc vuông [] là tùy chọn.</span></p><p></p><p><span style="font-size: 18px">Ví dụ:</span></p><p></p><p><span style="font-size: 18px">public delegate int DoSomething(int x, int y)</span></p><p></p><p><span style="font-size: 18px">Khai báo một delegate có tên DoSomething, bạn có thể dùng delegate này đại diện cho bất kì phương thức nào yêu cầu hai tham số kiểu int và trả về kiểu int.</span></p><p></p><p><span style="font-size: 18px"><strong>Khởi tạo</strong></span></p><p><span style="font-size: 18px">Giả sử ta có một phương thức sau, có kiểu trả về và tham số tương ứng với delegate DoSomething trên:</span></p><p></p><p style="margin-left: 20px"><span style="font-size: 18px"><strong>int</strong> <strong>Add</strong>(<strong>int</strong> x,<strong>int</strong> y)</span></p> <p style="margin-left: 20px"><span style="font-size: 18px">{</span></p> <p style="margin-left: 20px"><span style="font-size: 18px">return x+y;</span></p> <p style="margin-left: 20px"><span style="font-size: 18px">}</span></p><p><span style="font-size: 18px">Khởi tạo delegate từ một phương thức có sẵn, bạn cần truyền phương thức mà delegate sẽ đại diện vào trong constructor. Bạn có thể khởi tạo delegate theo một trong hai cách sau. Chúng tương đương nhau khi được biên dịch:</span></p><p></p><p style="margin-left: 20px"><span style="font-size: 18px">// cách 1</span></p> <p style="margin-left: 20px"><span style="font-size: 18px">DoSomething myDelegate = new DoSomething(Add)</span></p> <p style="margin-left: 20px"><span style="font-size: 18px">// cách 2</span></p> <p style="margin-left: 20px"><span style="font-size: 18px">DoSomething myDelegate = Add;</span></p><p><span style="font-size: 18px">Hoặc sử dụng tên đầy đủ của phương thức:</span></p><p></p><p style="margin-left: 20px"><span style="font-size: 18px">DoSomething obj = MyNamespace1.Program.Add;</span></p><p><span style="font-size: 18px">Thay vì tạo phương thức Add() trên, bạn có thể sử dụng anonymous method hoặc lambda expression để tạo đối tượng:</span></p><p></p><p style="margin-left: 20px"><span style="font-size: 18px">// anonymous method</span></p> <p style="margin-left: 20px"><span style="font-size: 18px">DoSomething obj = delegate(<strong>int</strong> x,<strong>int</strong> y){</span></p> <p style="margin-left: 20px"><span style="font-size: 18px">return x+y;</span></p> <p style="margin-left: 20px"><span style="font-size: 18px">};</span></p> <p style="margin-left: 20px"><span style="font-size: 18px">// lambda expression</span></p> <p style="margin-left: 20px"><span style="font-size: 18px">DoSomething obj = (x,y) => x+y;</span></p><p><span style="font-size: 18px"><strong>Thực thi</strong></span></p><p><span style="font-size: 18px">Có hai cách để bạn thực thi delegate.</span></p><p></p><p><span style="font-size: 18px">Coi delegate như một phương thức:</span></p><p></p><p style="margin-left: 20px"><span style="font-size: 18px">myDelegate(a, b)</span></p><p><span style="font-size: 18px">và như một đối tượng, bằng cách gọi phương thức Invoke():</span></p><p></p><p style="margin-left: 20px"><span style="font-size: 18px">myDelegate.Invoke(a, b)</span></p></blockquote><p></p>
[QUOTE="Hoàng Xuân Bách, post: 181255, member: 315148"] [SIZE=5]Một delegate giống như một “người đại diện” hay “đại sứ”. Một delegate có thể được dùng để tạo một bao đóng (encapsulation) cho bất kì phương thức nào, miễn là nó phù hợp (kiểu trả về, tham số). Là một “đại sứ”, delegate có thể triệu gọi phương thức bất kì nơi nào: từ đối tượng này đến đối tượng kia, từ thread này sang thread kia,… Đây là đặc điểm chính của delegate, bạn sẽ cần nhớ lại điều này khi giải quyết các vấn đề thường gặp như truyền dữ liệu giữa hai Form, xử lý lỗi “Cross-thread operation not valid”, tạo event, … Ta sẽ học cách sử dụng delegate qua 3 bước[/SIZE][B][SIZE=5]:[/SIZE][/B] [LIST] [*][SIZE=5] Khai báo[/SIZE] [*][SIZE=5] Khởi tạo[/SIZE] [*][SIZE=5]Thực thi[/SIZE] [/LIST] [SIZE=5][B]Khai báo[/B] Là một đại diện của phương thức và là một kiểu dữ liệu, cách khai báo delegate giống như một sự kết hợp giữa khai báo đối tượng và phương thức. Một delegate được khai báo theo cú pháp sau:[/SIZE] [SIZE=5][modifier] delegate return-type Identifier ([formal-parameters])[/SIZE] [SIZE=5]Trong đó:[/SIZE] [LIST] [*][SIZE=5]modifier: phạm vi truy xuất (public, private, protected, internal)[/SIZE] [*][SIZE=5]delegate: từ khóa[/SIZE] [*][SIZE=5]return-type: kiểu dữ liệu trả về[/SIZE] [*][SIZE=5]Identifier: định danh của delegate[/SIZE] [*][SIZE=5]formal-parameters: danh sách các tham số hình thức[/SIZE] [/LIST] [SIZE=5]Các phần trong cặp ngoặc vuông [] là tùy chọn.[/SIZE] [SIZE=5]Ví dụ:[/SIZE] [SIZE=5]public delegate int DoSomething(int x, int y)[/SIZE] [SIZE=5]Khai báo một delegate có tên DoSomething, bạn có thể dùng delegate này đại diện cho bất kì phương thức nào yêu cầu hai tham số kiểu int và trả về kiểu int.[/SIZE] [SIZE=5][B]Khởi tạo[/B] Giả sử ta có một phương thức sau, có kiểu trả về và tham số tương ứng với delegate DoSomething trên:[/SIZE] [INDENT][SIZE=5][B]int[/B] [B]Add[/B]([B]int[/B] x,[B]int[/B] y)[/SIZE][/INDENT] [INDENT][SIZE=5]{[/SIZE][/INDENT] [INDENT][SIZE=5]return x+y;[/SIZE][/INDENT] [INDENT][SIZE=5]}[/SIZE][/INDENT] [SIZE=5]Khởi tạo delegate từ một phương thức có sẵn, bạn cần truyền phương thức mà delegate sẽ đại diện vào trong constructor. Bạn có thể khởi tạo delegate theo một trong hai cách sau. Chúng tương đương nhau khi được biên dịch:[/SIZE] [INDENT][SIZE=5]// cách 1[/SIZE][/INDENT] [INDENT][SIZE=5]DoSomething myDelegate = new DoSomething(Add)[/SIZE][/INDENT] [INDENT][SIZE=5]// cách 2[/SIZE][/INDENT] [INDENT][SIZE=5]DoSomething myDelegate = Add;[/SIZE][/INDENT] [SIZE=5]Hoặc sử dụng tên đầy đủ của phương thức:[/SIZE] [INDENT][SIZE=5]DoSomething obj = MyNamespace1.Program.Add;[/SIZE][/INDENT] [SIZE=5]Thay vì tạo phương thức Add() trên, bạn có thể sử dụng anonymous method hoặc lambda expression để tạo đối tượng:[/SIZE] [INDENT][SIZE=5]// anonymous method[/SIZE][/INDENT] [INDENT][SIZE=5]DoSomething obj = delegate([B]int[/B] x,[B]int[/B] y){[/SIZE][/INDENT] [INDENT][SIZE=5]return x+y;[/SIZE][/INDENT] [INDENT][SIZE=5]};[/SIZE][/INDENT] [INDENT][SIZE=5]// lambda expression[/SIZE][/INDENT] [INDENT][SIZE=5]DoSomething obj = (x,y) => x+y;[/SIZE][/INDENT] [SIZE=5][B]Thực thi[/B] Có hai cách để bạn thực thi delegate.[/SIZE] [SIZE=5]Coi delegate như một phương thức:[/SIZE] [INDENT][SIZE=5]myDelegate(a, b)[/SIZE][/INDENT] [SIZE=5]và như một đối tượng, bằng cách gọi phương thức Invoke():[/SIZE] [INDENT][SIZE=5]myDelegate.Invoke(a, b)[/SIZE][/INDENT] [/QUOTE]
Tên
Mã xác nhận
Gửi trả lời
CÔNG NGHỆ
Công Nghệ Thông Tin
Code
Tìm hiểu về Delegate trong C#
Top