C# - C Sharp: Phương thức không tên

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Tổng quan

Phương thức không tên (Anonymous method) là một khối mã lệnh không có tên và có thể được truyền như là một tham số delegate.

Thông thường thì delegate có thể gọi một hoặc nhiều phương thức có tên và được áp dụng trong khi khai báo delegate. Trước khi có phương thức không tên, nếu ta muốn truyền một khối lệnh nhỏ tới một delegate thì ta luôn phải tạo một phương thức chứa khối lệnh nhỏ đó và truyền phương thức đó tới delegate; nhưng khi áp dụng phương thức không tên thì đơn giản ta chỉ cần truyền đi khối mã lệnh bên trong tới delegate mà không phải đặt nó vào một phương thức có tên cụ thể (tạo phương thức thực sự).

Dưới đây là một ví dụ áp dụng phương thức không tên:

using System;

namespace Demo
{
  class Demo
  {
    static void Main(string[] args)
    {
      System.Threading.Thread th = new System.Threading.Thread(
        delegate ()
        {
          Console.WriteLine("Example about Anonimous Method!");
        });
        th.Start();
    }
  }
}

Kết quả của ví dụ trên được thể hiện ở hình dưới đây:

http://v1study.com/public/images/article/csharp-anonymous-method-ex1.png

Đặc điểm của phương thức không tên

Phương thức không tên chỉ có thể được sử dụng thay cho phương thức có tên nếu phương thức không tên đó được gọi thông qua một delegate.

Mỗi phương thức không tên đều có những đặc điểm sau đây:

· Xuất hiên như một khối mã lệnh nội tuyến trong khai báo delegate.

· Là lựa chọn tốt nhất cho những khối mã lệnh nhỏ.

· Chấp nhận tham số với kiểu bất kỳ.

· Sử dụng được cả những tham số có kiểu generic

· Không được sử dụng những câu lệnh nhảy như goto, break, ... để chuyển quyền điều khiển ra ngoài phạm vi của phương thức.

Tạo phương thức không tên

Phương thức không tên được tạo khi bạn khởi tạo hoặc tham chiếu đến một delegate với một khối lệnh không tên. Những điều sau đây ta cần lưu ý khi tạo phương thức không tên:

· Ta có thể tạo phương thức không tên nằm bên ngoài hoặc bên trong phương thức có tên.

· Một khi đã xuất hiện từ khóa delegate trong thân của một phương thức thì bắt buộc delegate đó phải được theo sau bởi một khối mã lệnh không tên.

· Phương thức không tên được định nghĩa phải bao gồm cặp ngoặc xoắn ({}) khi tạo một đối tượng của delegate.

· Phương thức không tên không được có kiểu trả về.

· Phương thức không tên không được có bổ từ truy cập.

Cú pháp:

//Đầu tiên tạo một delegate trước
Access_modifier  delegate  Return_type Delegate_name(Parameters);
//Rồi sau đó mới tạo phương thức không tên
Delegate_name Delegate_instance = new Delegate_name(Parameters)
{
   Body_of_anonymous_method
};

, trong đó:

Access_modifier: Là bổ từ truy cập, bao gồm các bổ từ như public, protected, private, intarnal, protected intarnal.

Delegate_name: Là tên của delegate do ta tự đặt (đương nhiên phải tuân theo quy tắc đặt tên trong C#).

Đoạn mã dưới đây minh họa cách tạo và sử dụng phương thức không tên:

using System;

namespace Demo
{
  class AnonymousMethods
  {
    delegate void Display();
    //To phương thc không tên nm bên ngoài phương thc có tên
    static Display objDisplay = delegate ()
    {
      Console.WriteLine("This anonymous method is outside the named method.");
    };
    static void Main(string[] args)
    {
      //To phương thc không tên nm bên trong phương thc có tên
      Display objDisp = delegate ()
      {
        Console.WriteLine("This anonymous method is inside the named method.");
      };
      objDisp();
    }
  }
}

Kết quả của đoạn mã trên:

http://v1study.com/public/images/article/csharp-anonymous-method-ex2.png

Tham chiếu tới nhiều phương thức không tên

C# cho phép bạn tạo và khởi tạo một delegate để có thể tham chiếu tới nhiều phương thức không tên. Điều này được thực hiện bằng cách sử dụng toán tử +=. Toán tử += được dùng để bổ sung thêm các tham chiếu tới phương thức không tên hoặc có tên sau khi đã khởi tạo delegate. Ví dụ:

using System;

namespace Demo
{
  class MultipleAnonymousMethods
  {
    delegate void Display();
    static void Main(string[] args)
    {
      //delegate được khi to vi mt tham chiếu đến phương thc không tên
      Display objDisp = delegate ()
      {
        Console.WriteLine("This illustrates one anonymous method");
      };
      //delegate được b sung thêm mt phương thc không tên na
      objDisp += delegate ()
      {
        Console.WriteLine("This illustrates another anonymous method with the same delegate instance");
      };
      objDisp();
    }
  }
}

Kết quả của chương trình trên:

http://v1study.com/public/images/article/csharp-anonymous-method-add-reference-to-delegate.png

Biến ngoài (outer) của phương thức không tên

Ta có thể khai báo biến trong phương thức không tên, những biến này gọi là biến ngoài (outer). Các biến outer sẽ được 'chụp - capture' lại khi chúng được sử dụng đến; chúng sẽ được lưu trữ trong bộ nhớ cho đến khi delegate được thu dọn. Phạm vi hoạt động của các biến outer chỉ là nội trong phương thức không tên khai báo chúng.

Truyền tham số

C# cho phép truyền tham số tới phương thức không tên. Kiểu của các tham số được xác định ngay tại thời điểm khai báo delegate và các tham số được định nghĩa trong cặp ngoặc tròn sau tên của delegate. Phương thức không tên có quyền truy cập tất cả các tham số này giống như phương thức có tên. Ta có thể truyền giá trị cho các tham số của phương thức không tên khi delegate được gọi. Ví dụ:

using System;

namespace Demo
{
  class Parameters
  {
    delegate void Display(string str, int num);
    static void Main(string[] args)
    {
      Display objDisp = delegate (string str, int num)
      {
        Console.WriteLine(str + num);
      };
      objDisp("Value = ", 100);
    }
  }
}

Kết quả của ví dụ trên:

http://v1study.com/public/images/article/csharp-anonymous-method-passing-parameter.png

Lưu ý: Nếu việc định nghĩa phương thức không tên mà không bao gồm bất kỳ đối số nào thì bạn có thể sử dụng cặp ngoặc trống trong khai báo delegate. Phương thức không tên mà không có danh sách tham số thì chỉ có thể đi với những delegate không tham số.

Kiểm tra kiến thức của bạn

Câu nào sau đây là đúng khi nói về phương thức không tên trong C#?

(A): Phương thức không tên là các khối lệnh mà có thể được tích hợp với một cài đặt delegate.

(B): Các tham số của phương thức không tên luôn luôn có kiểu generic.

(C): Các phương thức không tên phù hợp với các khối lệnh nhỏ và lớn.

(D): Các biên được khai báo trong phương thức không tên được gọi là biến ngoài.

(E): Các giá trị của các tham số trong một phương thức không tên được truyền khi delegate được gọi.

Các lựa chọn cho bạn:

Phương án 1: (A), (D), (E)

Phương án 2: (B), (C)

Phương án 3:  (C), (E)

Phương án 4: (D)

» Tiếp: Partial
« Trước: Iterator
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!