• Trang chủ
  • Tin công nghệ
    sublime-text-3

    SublimeText: 10 plugin hổ trợ JavaScript

    Hướng dẫn sử dụng Layout trong Android và thiết kế giao diện hổ trợ nhiều loại màn hình

    Những tính năng mới trong C# 7

    Hướng dẫn sử dụng Layout trong Android và thiết kế giao diện hổ trợ nhiều loại màn hình

    Những tính năng mới trong C# 6

    5 Design Pattern mà developer nên biết

    5 Design Pattern mà developer nên biết

    Live Stream và những điều có thể bạn chưa biết

    Live Stream và những điều có thể bạn chưa biết

    10 ngôn ngữ lập trình được sử dụng nhiều nhất để đóng góp mã nguồn mở

    10 ngôn ngữ lập trình được sử dụng nhiều nhất để đóng góp mã nguồn mở

    Machine Learning góp phần cải thiện chiến lược Digital Marketing của bạn như thế nào?

    Machine Learning góp phần cải thiện chiến lược Digital Marketing của bạn như thế nào?

    7 công nghệ nổi bật phát triển mạnh năm 2018

    7 công nghệ nổi bật phát triển mạnh năm 2018

    Bitcoin đã được khai thác 80% tổng lượng

    Bitcoin đã được khai thác 80% tổng lượng

  • Lập trình Android
  • Java & Java EE
  • Thiết kế web
    Hướng dẫn thêm nút chia sẻ ZALO cho website

    Hướng dẫn thêm nút chia sẻ ZALO cho website

    sublime-text-3

    SublimeText: 10 plugin hổ trợ JavaScript

    sublime-text-3

    Sublime Text 3 và các plugin cần thiết cho lập trình Laravel

    Top xu hướng thiết kế web cho năm 2017

    Top xu hướng thiết kế web cho năm 2017

    Tạo Layout đơn giản với DIV và CSS

    Tạo Layout đơn giản với DIV và CSS

    Tạo ứng dụng Swing bằng Netbean

    Backlink là gì? Cách tạo backlink?

    Tạo ứng dụng Swing bằng Netbean

    Giới thiệu về HTML5 và CSS3

  • Lập trình C#
    Hướng dẫn sử dụng Layout trong Android và thiết kế giao diện hổ trợ nhiều loại màn hình

    Tag Helpers trong ASP.NET Core MVC

    Hướng dẫn sử dụng Layout trong Android và thiết kế giao diện hổ trợ nhiều loại màn hình

    Những tính năng mới trong C# 7

    Hướng dẫn sử dụng Layout trong Android và thiết kế giao diện hổ trợ nhiều loại màn hình

    Những tính năng mới trong C# 6

    Hướng dẫn sử dụng Crystal Report với Visual Studio

    Hướng dẫn sử dụng Crystal Report với Visual Studio

    7 thủ thuật Windows Group Policy trong Windows 10

    7 thủ thuật Windows Group Policy trong Windows 10

    5 cách để học lập trình nhanh hơn

    Ví dụ minh họa Client-Server trong C#

    Remotting

    Remotting

    Debug chương trình với VS.NET

    Debug chương trình với VS.NET

    Tạo Form có hình dạng bất kỳ trong C#

    Tạo Form có hình dạng bất kỳ trong C#

  • Lập trình PHP
    php-mysql

    Sử dụng mệnh đề WHERE của câu lệnh SELECT trong PHP và MySQL

    php-mysql

    Sử dụng câu lệnh SELECT trong PHP và MySQL

    php-mysql

    Lấy giá trị của cột tự tăng của record vừa được thêm mới

    php-mysql

    MySQL prepared statements trong PHP

    php-mysql

    Sử dụng INSERT trong MySQL & PHP

    php-mysql

    Tạo cơ sở dữ liệu và bảng trong MySQL bằng PHP

    sublime-text-3

    Sublime Text 3 và các plugin cần thiết cho lập trình Laravel

    WordPress-Cách chia bài viết dài thành nhiều trang

    WordPress-Làm nổi bật comment của tác giả bài viết

No Result
View All Result
Học Lập Trình
  • Trang chủ
  • Tin công nghệ
    sublime-text-3

    SublimeText: 10 plugin hổ trợ JavaScript

    Hướng dẫn sử dụng Layout trong Android và thiết kế giao diện hổ trợ nhiều loại màn hình

    Những tính năng mới trong C# 7

    Hướng dẫn sử dụng Layout trong Android và thiết kế giao diện hổ trợ nhiều loại màn hình

    Những tính năng mới trong C# 6

    5 Design Pattern mà developer nên biết

    5 Design Pattern mà developer nên biết

    Live Stream và những điều có thể bạn chưa biết

    Live Stream và những điều có thể bạn chưa biết

    10 ngôn ngữ lập trình được sử dụng nhiều nhất để đóng góp mã nguồn mở

    10 ngôn ngữ lập trình được sử dụng nhiều nhất để đóng góp mã nguồn mở

    Machine Learning góp phần cải thiện chiến lược Digital Marketing của bạn như thế nào?

    Machine Learning góp phần cải thiện chiến lược Digital Marketing của bạn như thế nào?

    7 công nghệ nổi bật phát triển mạnh năm 2018

    7 công nghệ nổi bật phát triển mạnh năm 2018

    Bitcoin đã được khai thác 80% tổng lượng

    Bitcoin đã được khai thác 80% tổng lượng

  • Lập trình Android
  • Java & Java EE
  • Thiết kế web
    Hướng dẫn thêm nút chia sẻ ZALO cho website

    Hướng dẫn thêm nút chia sẻ ZALO cho website

    sublime-text-3

    SublimeText: 10 plugin hổ trợ JavaScript

    sublime-text-3

    Sublime Text 3 và các plugin cần thiết cho lập trình Laravel

    Top xu hướng thiết kế web cho năm 2017

    Top xu hướng thiết kế web cho năm 2017

    Tạo Layout đơn giản với DIV và CSS

    Tạo Layout đơn giản với DIV và CSS

    Tạo ứng dụng Swing bằng Netbean

    Backlink là gì? Cách tạo backlink?

    Tạo ứng dụng Swing bằng Netbean

    Giới thiệu về HTML5 và CSS3

  • Lập trình C#
    Hướng dẫn sử dụng Layout trong Android và thiết kế giao diện hổ trợ nhiều loại màn hình

    Tag Helpers trong ASP.NET Core MVC

    Hướng dẫn sử dụng Layout trong Android và thiết kế giao diện hổ trợ nhiều loại màn hình

    Những tính năng mới trong C# 7

    Hướng dẫn sử dụng Layout trong Android và thiết kế giao diện hổ trợ nhiều loại màn hình

    Những tính năng mới trong C# 6

    Hướng dẫn sử dụng Crystal Report với Visual Studio

    Hướng dẫn sử dụng Crystal Report với Visual Studio

    7 thủ thuật Windows Group Policy trong Windows 10

    7 thủ thuật Windows Group Policy trong Windows 10

    5 cách để học lập trình nhanh hơn

    Ví dụ minh họa Client-Server trong C#

    Remotting

    Remotting

    Debug chương trình với VS.NET

    Debug chương trình với VS.NET

    Tạo Form có hình dạng bất kỳ trong C#

    Tạo Form có hình dạng bất kỳ trong C#

  • Lập trình PHP
    php-mysql

    Sử dụng mệnh đề WHERE của câu lệnh SELECT trong PHP và MySQL

    php-mysql

    Sử dụng câu lệnh SELECT trong PHP và MySQL

    php-mysql

    Lấy giá trị của cột tự tăng của record vừa được thêm mới

    php-mysql

    MySQL prepared statements trong PHP

    php-mysql

    Sử dụng INSERT trong MySQL & PHP

    php-mysql

    Tạo cơ sở dữ liệu và bảng trong MySQL bằng PHP

    sublime-text-3

    Sublime Text 3 và các plugin cần thiết cho lập trình Laravel

    WordPress-Cách chia bài viết dài thành nhiều trang

    WordPress-Làm nổi bật comment của tác giả bài viết

No Result
View All Result
Học Lập Trình
No Result
View All Result

delegate và event trong C#

qadmin by qadmin
19/09/2013
in Lập trình C#
0 0
0
5 cách để học lập trình nhanh hơn
0
SHARES
260
VIEWS
Share on FacebookShare on Twitter

Giới thiệu

Trong các ứng dụng Windows Form, khi ta click chuột vào một button hay chọn một mục trong listbox, thì đều phát sinh một sự kiện (event). Chương trình có nhiệm vụ xử lý các sự kiện này, chứ không phải các control button hay listbox xử lý. Chính cơ chế này đã tạo ra khả năng tương tác linh hoạt giữa người dùng và chương trình. Người dùng gửi đến chương trình các yêu cầu thông qua các sự kiện, chương trình đáp ứng sự kiện đó và thực hiện một tác vụ nào đó.
Những sự kiện đó đều được thực thi bởi cơ chế ủy quyền (delegate). Trong bài viết này, tôi sẽ giới thiệu với các bạn khái niệm delegate và cách sử dụng nó để tạo event (sự kiện) trong C#.

Delegate là gì?

Delegate đơn giản chỉ là một kiểu dữ liệu tham chiếu (reference type) dùng để đóng gói một phương thức với tham số và kiểu trả về xác định. Chúng ta có thể đóng gói bất kỳ phương thức nào trong một delegate thích hợp.
Delegate trong C# cũng tương tự như con trỏ hàm trong C++ (function pointer). Bạn sẽ dễ dàng tiếp cận delegate nếu bạn đã từng sử dụng con trỏ hàm trong C++.
Delegate thường được sử dụng để tạo các sự kiện và các hàm callback cho chương trình.

Khai báo delegate

Cú pháp khai báo delegate trong C# như sau:

chỉ_định_từ_truy_xuất delegate kiểu_trả_về tên_delegate(danh_sách_tham_số);

Trong đó:

  • chỉ_định_từ_truy_xuất: là một trong các thuộc tính truy cập: private, public, protected, internal.
  • kiểu_trả_về: kiểu trả về của phương thức
  • tên_delegate: tên của delegate
  • danh_sách_tham_số: các tham số của phương thức

Chú ý: delegate chỉ mô tả dạng tổng quát của phương thức, bao gồm kiểu trả về và tham số. Còn phương thức cụ thể sẽ được truyền vào thông qua một thể hiện (instance) của delegate. Ví dụ:

public delegate void MyEventHandler(string Message);

Delegate này đại diện cho tập các phương thức có một tham số đầu vào có kiểu string và có kiểu trả về là void.
Để sử dụng delegate, chúng ta phải tạo một thể hiện của nó (tương tự như tạo đối tượng của lớp) và truyền vào phương thức phù hợp (kiểu trả về và tham số) vào hàm khởi tạo của nó. Ví dụ:

using System;

namespace DelegateDemo
{
public delegate void MyEventHandler(string msg);

public class Demo
{
public static void Main()
{
Demo d = new Demo();
MyEventHandler handler = new MyEventHandler(d.DisplayMsg);
handler("Display Message Here.");
Console.ReadLine();
}
public void DisplayMsg(string msg)
{
Console.WriteLine(msg);
}
}
}

Trong ví dụ trên, tôi đã tạo ra một delegate tên là MyEventHandler đại diện cho các phương thức có một tham số đầu vào có kiểu string và có kiểu trả về là void. Sau đó, tôi tạo ra một thể hiện của MyEventHandler có tên là handler, truyền vào phương thức khởi tạo của nó là DisplayMsg (dòng 12 trong ví dụ minh họa ở trên). Hàm DisplayMsg này có phần khai báo giống với phần khai báo của delegate MyEventHandler.
Khi các bạn gọi handler và truyền cho nó chuỗi: “Display Message Here.”, nó sẽ gọi hàm DisplayMsg và truyền chuỗi “Display Message Here.” cho hàm này.

Kỹ thuật Multicasting

C# cho phép chúng ta “gắn” nhiều phương thức vào cùng một delegate, miễn là các phương thức này có cùng kiểu trả về và tham số với delegate. Và khi ta gọi delegate này, tất cả các phương thức đã được “gắn” sẽ thi hành cùng lúc. Kỹ thuật này gọi là “Multicasting”.

Chú ý : Một multicast delegate chỉ chấp nhận phương thức có kiểu trả về là void.

Để thực hiện Multicasting, ta tạo các thể hiện của một multicast delegate, gắn nó với các phương thức tương ứng. Sau đó dùng toán tử “+” để gom các delegate này vào thành 1 delegate duy nhất. Dưới đây là ví dụ minh họa:

using System;

namespace DelegateDemo
{
public delegate void MyEventHandler(string msg);

public class Demo
{
public static void Main()
{
Demo d = new Demo();
MyEventHandler handler1 = new MyEventHandler(d.DisplayMsg);
MyEventHandler handler2 = new MyEventHandler(d.DisplayMsg);
MyEventHandler handler = handler1 + handler2;
handler("Test");
Console.ReadLine();
}
public void DisplayMsg(string msg)
{
Console.WriteLine(msg);
}
public void ShowHello(string name)
{
Console.WriteLine("Hello " + name);
}
}
}

Trong ví dụ trên, đầu tiên, chúng ta tạo ra hai delegate là handler1 và hanlder2 gắn hai hàm DisplayMsg() và ShowHello() vào. Sau đó, chúng ta tạo delegate tên là handler và “cộng” hai delegate handler1 và hanlder2 lại với nhau. Như vậy, khi gọi delegate handler, hai delegate handler1 và hanlder2 sẽ đồng thời được gọi.
Ngoài toán tử “+”, C# còn hổ trợ toán tử “+=” và “-=” trên delegate. Ví dụ:

using System;

namespace DelegateDemo
{
public delegate void MyEventHandler(string msg);

public class Demo
{
public static void Main()
{
Demo d = new Demo();
MyEventHandler handler = new MyEventHandler(d.DisplayMsg);
handler += d.ShowHello;
handler("Test");
Console.ReadLine();
}
public void DisplayMsg(string msg)
{
Console.WriteLine(msg);
}
public void ShowHello(string name)
{
Console.WriteLine("Hello " + name);
}
}
}

Event (sự kiện)

Một trong những ứng dụng thường thấy nhất của delegate là event. Mỗi sự kiện thực chất là một delegate.
Cú pháp khai báo event trong C# như sau:

chỉ_định_từ_truy_xuất event tên_delegate tên_event;

Trong đó:

  • chỉ_định_từ_truy_xuất: là một trong các thuộc tính truy cập: private, public, protected, internal.
  • tên_delegate: kiểu của delegate đại diện cho event
  • tên_event: tên của event

Ví dụ:

public delegate void MyEventHandler(string msg);
public event MyEventHandler Click;

Sau đó chúng ta có thể phát ra sự kiện (fire event) bằng cách gọi tên sự kiện và truyền tham số tương ứng.
Ví dụ:

namespace DelegateDemo
{
public delegate void MyEventHandler(string msg);
public class Window
{
public event MyEventHandler Click;

public Window(int top, int left)
{
this.top = top;
this.left = left;
}
// mô phỏng vẽ cửa sổ
public virtual void DrawWindow() { }
public void FireEvent()
{
if (Click != null)
Click("Event Fire.");
}
// Có hai biến thành viên private do đó hai
// biến này sẽ không thấy bên trong lớp con
int top;
private int left;
}
// ListBox dẫn xuất từ Window
public class ListBox : Window
{
public ListBox(int top, int left)
: base(top, left)
{
//Console.WriteLine("Constructor's ListBox have 2 parameter");
}
// Khởi dựng có tham số
public ListBox(int top, int left, string theContents)
: base(top, left) // gọi khởi dựng của lớp cơ sở
{
mListBoxContents = theContents;
}

public override void DrawWindow()
{
Console.WriteLine("DrawWindow's ListBox");
}

// biến thành viên private
private string mListBoxContents;
}

public class Tester
{
public static void Main()
{
Window w = new Window(100, 100);
w.Click += w_Click;
w.FireEvent(); // phát sinh sự kiện
Console.ReadLine();
}

static void w_Click(string msg)
{
Console.WriteLine(msg);
}
}
}

Tags: c#codecodingtrainingtutorial
Previous Post

Indexer với chỉ số kiểu số nguyên

Next Post

Tạo Form có hình dạng bất kỳ trong C#

qadmin

qadmin

Related Posts

Hướng dẫn sử dụng Layout trong Android và thiết kế giao diện hổ trợ nhiều loại màn hình

Tag Helpers trong ASP.NET Core MVC

13/12/2020
Hướng dẫn sử dụng Layout trong Android và thiết kế giao diện hổ trợ nhiều loại màn hình

Những tính năng mới trong C# 7

03/12/2020
Hướng dẫn sử dụng Layout trong Android và thiết kế giao diện hổ trợ nhiều loại màn hình

Những tính năng mới trong C# 6

03/12/2020
Hướng dẫn sử dụng Crystal Report với Visual Studio

Hướng dẫn sử dụng Crystal Report với Visual Studio

19/11/2020
7 thủ thuật Windows Group Policy trong Windows 10

7 thủ thuật Windows Group Policy trong Windows 10

15/12/2016
5 cách để học lập trình nhanh hơn

Ví dụ minh họa Client-Server trong C#

05/10/2013
Next Post
Tạo Form có hình dạng bất kỳ trong C#

Tạo Form có hình dạng bất kỳ trong C#

Trả lời Hủy

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

You might also like

Hướng dẫn thêm nút chia sẻ ZALO cho website

Hướng dẫn thêm nút chia sẻ ZALO cho website

08/07/2021
sublime-text-3

SublimeText: 10 plugin hổ trợ JavaScript

16/01/2021
Hướng dẫn sử dụng Layout trong Android và thiết kế giao diện hổ trợ nhiều loại màn hình

Tag Helpers trong ASP.NET Core MVC

13/12/2020
Hướng dẫn sử dụng Layout trong Android và thiết kế giao diện hổ trợ nhiều loại màn hình

Những tính năng mới trong C# 7

03/12/2020
Hướng dẫn sử dụng Layout trong Android và thiết kế giao diện hổ trợ nhiều loại màn hình

Những tính năng mới trong C# 6

03/12/2020
php-mysql

Sử dụng mệnh đề WHERE của câu lệnh SELECT trong PHP và MySQL

13/11/2020
Học Lập Trình

Code5s.com được xây dựng với mong muốn mang lại những bài học hữu ích, thiết thực, và chất lượng cho mọi người.

Chuyên mục

Công cụ Java & Java EE Lập trình Android Lập trình C# Lập trình PHP Thiết kế web Tin công nghệ Tips Tài liệu Wearable Web Services XML

Kết nối

  • Trang chủ
  • Tin công nghệ
  • Lập trình Android
  • Java & Java EE
  • Thiết kế web
  • Lập trình C#
  • Lập trình PHP

© 2020 Code5s.com

No Result
View All Result
  • Trang chủ
  • Tin công nghệ
  • Lập trình Android
  • Java & Java EE
  • Thiết kế web
  • Lập trình C#
  • Lập trình PHP

© 2020 Code5s.com

Welcome Back!

Login to your account below

Forgotten Password?

Create New Account!

Fill the forms bellow to register

All fields are required. Log In

Retrieve your password

Please enter your username or email address to reset your password.

Log In