Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 12 kết quả

Đề tài: Cơ bản Delegate trong lập trình C#

  1. #1
    Ngày gia nhập
    06 2009
    Nơi ở
    Cái hộp
    Bài viết
    1,255

    Mặc định Cơ bản Delegate trong lập trình C#

    Delegate là một kiến thức căn bản cần nắm vững khi bạn nhập môn C#, .NET. Mặc dù bạn có thể cho rằng delegate không cần thiết và tránh sử dụng nó (một cách trực tiếp) nhưng cuối cùng bạn vẫn phải nhận thấy rằng: mình không thể “sống” khi thiếu delegate. Delegate không khó hiểu cũng như không khó để áp dụng, nếu bạn dành một chút thời gian nghiên cứu.

    Delegate là gì?

    Trong tiếng Việt, delegate được dịch là “ủy nhiệm hàm”, tuy nhiên mọi người đều không sử dụng từ này mà gọi bằng tên gốc là delegate. Thật tốt nếu bạn đã từng biết qua trong C/C++, đặc biệt về khái niệm con trỏ, bởi vì delegate tương tự như con trỏ hàm trong C++.


    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, ...

    Ngoài ra, bởi vì là một đối tượng, delegate có thể được truyền vào làm tham số của các phương thức. Bạn có thể hiểu đơn giản: delegate là một đối tượng dùng để bao đóng một hoặc nhiều phương thức (Multicast), hay có thể coi delegate là một sự kết hợp giữa đối tượng và phương thức.

    Ta sẽ học cách sử dụng delegate qua 3 bước:
    • Khai báo
    • Khởi tạo
    • Thực thi

    Khai báo

    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:

    [modifier] delegate return-type Identifier ([formal-parameters])
    Trong đó:

    • modifier: phạm vi truy xuất (public, private, protected, internal)
    • delegate: từ khóa
    • return-type: kiểu dữ liệu trả về
    • Identifier: định danh của delegate
    • formal-parameters: danh sách các tham số hình thức

    Các phần trong cặp ngoặc vuông [] là tùy chọn.

    Ví dụ:

    Visual C# Code:
    1. public delegate int DoSomething(int x, int y)

    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.

    Khởi tạo

    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:

    Visual C# Code:
    1. int Add(int x,int y)
    2. {
    3.     return x+y;
    4. }

    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:

    Visual C# Code:
    1. // cách 1
    2. DoSomething myDelegate = new DoSomething(Add)
    3. // cách 2
    4. DoSomething myDelegate = Add;

    Hoặc sử dụng tên đầy đủ của phương thức:

    Visual C# Code:
    1. DoSomething obj = MyNamespace1.Program.Add;

    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:

    Visual C# Code:
    1. // anonymous method
    2. DoSomething obj = delegate(int x,int y){
    3.     return x+y;
    4. };
    5. // lambda expression
    6. DoSomething obj = (x,y) => x+y;

    Thực thi

    Có hai cách để bạn thực thi delegate.
    Coi delegate như một phương thức:

    Visual C# Code:
    1. myDelegate(a, b)

    và như một đối tượng, bằng cách gọi phương thức Invoke():

    Visual C# Code:
    1. myDelegate.Invoke(a, b)

    Ví dụ

    Visual C# Code:
    1. class Program
    2. {
    3.     public delegate int DoSomething(int x,int y);
    4.    
    5.     public static void Main(string[] args)
    6.     {
    7.         Math m=new Math();
    8.         DoSomething obj = (x,y)=>x+y;
    9.        
    10.         int value=obj(3,4);
    11.        
    12.         Console.WriteLine(value); // output: 7
    13.         Console.ReadKey();    
    14.     }    
    15. }

    Tiếp theo là gì?

    Sau khi hiểu được cơ bản delegate, bạn có thể cần tìm hiểu thêm về event. Trong .NET cũng có những delegate được tạo sẵn (build-in), bạn có thể tìm thấy các vấn đề này trong blog của tôi tại:

    - Anonymous Method
    - Lamdba Expression
    - Event

    Một series hướng dẫn khá đầy đủ về delegate và event trên codeproject, bao gồm cả multicast delegate:

    Delegates in C# - Attempt to look inside. Part 1 - How to understand and use delegates in your program.
    Delegates in C# - Attempt to look inside. Part 2 - Call delegates asynchronously if you need.
    Delegates in C# - Attempt to look inside. Part 3 - More about delegates. Meet the Event.
    Delegates in C# - Attempt to look inside. Part 4 – More Delegates in .NET



    Bài gốc: C# - Cơ bản Delegate (very basic)
    Men talk of killing time, while time quietly kills them.
    Time is what we want most, but what we use worst.
    ------------------------------
    YinYang's Programming Blog

  2. #2
    Ngày gia nhập
    02 2010
    Bài viết
    52

    Mình áp dụng theo hướng dẫn thì mình bị lỗi như sau:
    A field initializer cannot reference the non-static field, method, or property 'Quan_Ly_Sinh_Vien.Quan_Ly_Sinh_Vien.settxtconnect (string)'
    báo lỗi ngay dòng khởi tạo:
    Code:
    private delegate void delegate_settxtconnect(string s);
    
    private void settxtconnect(string s)
    {
          txtconnect.Text = s;
    }
    private delegate_settxtconnect mydelegate = new delegate_settxtconnect(settxtconnect);
    Email : leminhphuoc89@gmail.com

  3. #3
    Ngày gia nhập
    03 2009
    Nơi ở
    C:\Windows\system32
    Bài viết
    18

    private void settxtconnect(string s)
    {
    txtconnect.Text = s;
    }
    private delegate_settxtconnect mydelegate = new delegate_settxtconnect(settxtconnect);
    Thay thế thành:
    Visual C# Code:
    1. private static void settxtconnect(string s)
    2. {
    3.       txtconnect.Text = s;
    4. }
    5. delegate_settxtconnect mydelegate = new delegate_settxtconnect(settxtconnect);

  4. #4
    Ngày gia nhập
    02 2010
    Bài viết
    52

    Trích dẫn Nguyên bản được gửi bởi persevering Xem bài viết
    Thay thế thành:
    Visual C# Code:
    1. private static void settxtconnect(string s)
    2. {
    3.       txtconnect.Text = s;
    4. }
    5. delegate_settxtconnect mydelegate = new delegate_settxtconnect(settxtconnect);
    sau khi mình sửa lại giống bạn thì nó hiện lỗi này :
    An object reference is required for the non-static field, method, or property 'Quan_Ly_Sinh_Vien.Quan_Ly_Sinh_Vien.txtconnect'
    báo lỗi ngay chữ màu đỏ :
    Code:
    delegate void delegate_settxtconnect(string s);
    
    private static void settxtconnect(string s)
    {
          txtconnect.Text = s;
    }
    
    delegate_settxtconnect setip = new delegate_settxtconnect(settxtconnect);
    Đã được chỉnh sửa lần cuối bởi lion080889 : 19-07-2011 lúc 10:12 PM.
    Email : leminhphuoc89@gmail.com

  5. #5
    Ngày gia nhập
    01 2010
    Nơi ở
    Hà Nội
    Bài viết
    128

    Thế này có nghĩa là txtconnect là không static . txtconnect là gì vậy ? Bạn nói rõ hơn đi ?

  6. #6
    Ngày gia nhập
    02 2010
    Bài viết
    52

    Mặc định Cơ bản Delegate trong lập trình C#

    Trích dẫn Nguyên bản được gửi bởi kids301090 Xem bài viết
    Thế này có nghĩa là txtconnect là không static . txtconnect là gì vậy ? Bạn nói rõ hơn đi ?
    nó là 1 textbox có name là txtconnect và textbox này được đặt trong 1 groupbox

    có người chỉ mình làm bằng cách này thì được:
    Visual C# Code:
    1. private delegate void delegate_settxtconnect(string s);
    2.  
    3.         private void settxtconnect(string s)
    4.         {
    5.             if (this.InvokeRequired) this.Invoke(new delegate_settxtconnect(settxtconnect), s);
    6.             else txtconnect.Text = s;
    7.         }
    nhưng mình ko hiểu, nên muốn tự làm theo cách cơ bản như trên, nhưng lại bị lỗi, bạn giúp mình sửa lỗi trên và giải thích giùm mình đoạn code trên luôn được ko?
    thanks
    Email : leminhphuoc89@gmail.com

  7. #7
    Ngày gia nhập
    06 2009
    Nơi ở
    Cái hộp
    Bài viết
    1,255

    Lỗi này thuộc về cách và thứ tự khởi tạo các field trong .Net. Bạn không thể khởi tạo field này = 1 field trước đó nếu nó không được đặt là static. Bạn giải quyết bằng cách đặt lại phuơng thức là static, tuy nhiên tốt nhất là khởi tạo delegate trong một phuơng thức.
    Đã được chỉnh sửa lần cuối bởi Yin Yang : 21-07-2011 lúc 05:30 PM.
    Men talk of killing time, while time quietly kills them.
    Time is what we want most, but what we use worst.
    ------------------------------
    YinYang's Programming Blog

  8. #8
    Ngày gia nhập
    02 2010
    Bài viết
    52

    Trích dẫn Nguyên bản được gửi bởi Yin Yang Xem bài viết
    Bạn giải quyết bằng cách đặt lại delegate là static, tuy nhiên tốt nhất là khởi tạo delegate trong một phuơng thức.
    bạn nói mình chưa hiểu lắm, bạn có thể fix lỗi trên bằng 2 cách mà bạn nói trên được ko?
    Email : leminhphuoc89@gmail.com

  9. #9
    Ngày gia nhập
    06 2009
    Nơi ở
    Cái hộp
    Bài viết
    1,255

    Trong trả lời trên mình ghi là đặt delegate là static, đúng ra là phuơng thức (đã update), tức là các giá trị bạn sử dụng để khởi tạo một field nào đó phải được để là static. Trong trường hợp trên thì đó là phuơng thức settxtconnect(). Tuy nhiên khi để phuơng thức này là static thì các đối tượng được sử dụng bên trong cũng phải là static, do đó sẽ có lỗi với txtconnect.
    Visual C# Code:
    1. private static void settxtconnect(string s)
    2. {
    3. txtconnect.Text = s; // error
    4. }

    Đặt phần khởi tạo của delegate trong 1 phuơng thức, bạn nên dùng cách này:
    Visual C# Code:
    1. private  delegate_settxtconnect mydelegate; // = new delegate_settxtconnect(settxtconnect);
    2. void Init()
    3. {
    4.     mydelegate = new delegate_settxtconnect(settxtconnect);
    5. }

    Bạn nên coi lại OOP và C# cơ bản phần static.
    Men talk of killing time, while time quietly kills them.
    Time is what we want most, but what we use worst.
    ------------------------------
    YinYang's Programming Blog

  10. #10
    Ngày gia nhập
    02 2010
    Bài viết
    52

    bạn đưa mấy đoạn code trên mình ko biết phải đặt như thế nào nữa, tạo thêm phương thức mà ko biết dùng nó vào vị trí nào, thử hoài cũng lỗi, dù sao cũng cám ơn bạn nhiều ^^
    bạn nói có lý, chắc phải đi học cho biết mấy chỗ này và những kiến thức căn bản khác, tự học thì khó hiểu quá ^^!
    Email : leminhphuoc89@gmail.com

Các đề tài tương tự

  1. Cách dùng delegate trong lập trình C#
    Gửi bởi zkday2686 trong diễn đàn Tutorials và Thủ thuật lập trình C#, ASP.NET
    Trả lời: 48
    Bài viết cuối: 10-11-2016, 10:37 AM
  2. Delegate trong c# có tác dụng như thế nào?
    Gửi bởi yuno trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 7
    Bài viết cuối: 15-07-2011, 12:13 PM
  3. Database event và delegate trong c #
    Gửi bởi binh08dbb trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 05-07-2011, 11:01 PM
  4. hàm delegate trong C# sử dụng như thế nào?
    Gửi bởi gacon09cntt trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 3
    Bài viết cuối: 03-12-2010, 05:41 PM
  5. Delegate trong C#, help me!
    Gửi bởi MaiLinh trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 3
    Bài viết cuối: 23-10-2009, 09:27 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn