Lập trình C#

Extension method trong C# là gì? Và cách sử dụng của nó

Extension method trong C# là gì? Và cách sử dụng của nó
Được viết bởi Minh Hoàng

Series lập trình C#, ngôn ngữ lập trình hiện đại và mạnh mẽ.

Extension method giúp bạn tạo thêm các phương thức cho một lớp mà không cần thừa kế lại lớp đó. Với tính năng này, thậm chí khi đối tượng của bạn là null, bạn vẫn có thể thực hiện các extension method của đối tượng đó một cách an toàn.

Extension method có thể overload.

Extension method là một loại phương thức tĩnh (static method) đặc biệt được bổ sung vào các lớp đã tồn tại, chúng được gọi như phương thức thể hiện (instance method) thông thường của lớp đó.

Extension methodinstance method: khi trong class đang thao tác có một instance method cùng tên với extension method thì khi gọi: instance method sẽ được thực thi, mức độ ưu tiên cao hơn extension method.

– Các extension method sử dụng một attribute là System.Runtime.CompilerServices.ExtensionAttribute, ExtensionAttribute này có nhiệm vụ chỉ ra một phương thức là một extension method, assembly hay class có chứa extension method. Và sự xuất hiện của attribute này là do từ khóa this mà đặt trước tham số đầu tiên của extension method. Tuy nhiên, bạn không thể sử dụng attribute này thay thế cho từ khóa this, nếu làm như vậy chương trình sẽ báo lỗi.

– Một điểm cơ bản cần lưu ý khi sử dụng extension method: bởi vì chúng không thực sự nằm trong các lớp sẵn có của .NET, nên bạn cần chắc chắn các extension method được khai báo để có thể truy xuất được tại nơi mà bạn gọi nó. Giống như khi bạn sử dụng Linq, thì cần phải using System.Linq;

– Nếu trong trường hợp có extension method TRÙNG TÊN ở 2 namespace khác nhau thì sau khi using tên cả 2 namespace ở nơi bạn muốn gọi, khi muốn gọi extension method của namespace nào thì bạn thêm tên namespace ấy trước extension method muốn gọi theo cú pháp: TênNamespace.TênExtensionMethod().

– Các quy tắc khi định nghĩa và sử dụng extension method:

  1. Lớp chứa extension method phải là static.
  2. Extension method cũng phải là một phương thức static.
  3. Tham số đầu tiên của extension method xác định kiểu của đối tượng sẽ mở rộng được sử dụng với từ khóa this, và tham số đầu tiên này sẽ được bỏ qua khi extension method được gọi.

– Để dễ hình dung, chúng ta sẽ cùng đi vào ví dụ sau:

#1/3:

Trong ví dụ này, đơn giản là chúng ta sẽ mở rộng cho class string có sẵn của .NET 2 method mới:

  1. Extension method 1: check chuỗi input có phải số hay không.
  2. Extension method 2: cộng 2 số.
#2/3:

– Sau khi tạo project, chúng ta sẽ tạo một folder trong project có tên là Library, sau đó thêm file StringExtensions.cs để tạo 2 phương thức mở rộng cho class string đã nói ở #1/3:

Extension method trong C# - Hình 1

– Nội dung của file StringExtensions.cs như sau:

namespace MinhHoangBlog.Library
{
	/// <summary>
	/// Tạo 2 extension method cho lớp string
	/// </summary>
	public static class StringExtensions
	{
		/// <summary>
		/// Extension method 1: check chuỗi input có phải số hay không
		/// </summary>
		/// <param name="inStr">Chuỗi cần kiểm tra</param>
		/// <returns>true:Là số、false:không phải số</returns>
		public static bool IsNumber(this string inStr)
		{
			int n = 0;
			var rtn = int.TryParse(inStr, out n);
			return rtn;
		}

		/// <summary>
		/// Extension method 2: Cộng 2 số
		/// </summary>
		/// <param name="inStr">Chuỗi đại diện</param>
		/// <param name="inNum1">Số thứ nhất</param>
		/// <param name="inNum2">Số thứ hai</param>
		/// <returns>Tổng của 2 số inNum1, inNum2</returns>
		public static int Add2Numbers(this string inStr, int inNum1, int inNum2)
		{
			return inNum1 + inNum2;
		}
	}
}

#3/3:

Ở nơi gọi extension method Program.cs cần phải khai báo namespace của file chứa extension method, trong ví dụ này sẽ using MinhHoangBlog.Library;

using System;

// Thêm thư viện chứa extension method
using MinhHoangBlog.Library;

namespace MinhHoangBlog
{
	class Program
	{
		static void Main(string[] args)
		{
			Console.Write("Enter your number: ");
			string input = Console.ReadLine();

			// Gọi extension method 1
			bool isNumber = input.IsNumber();
			Console.WriteLine("isNumber: {0}", isNumber);

			// Gọi extension method 2
			int sum = input.Add2Numbers(9, 10);
			Console.WriteLine("Sum: 9 + 10 = {0}", sum);

			Console.ReadKey();
		}
	}
}
Kết quả chương trình

Kết quả chương trình

Cảm ơn bạn đã theo dõi. Đừng ngần ngại hãy cùng thảo luận với chúng tôi!

Giới thiệu

Minh Hoàng

Xin chào, tôi là Hoàng Ngọc Minh, hiện đang làm BrSE, tại công ty Toyota, Nhật Bản. Những gì tôi viết trên blog này là những trải nghiệm thực tế tôi đã đúc rút ra được trong cuộc sống, quá trình học tập và làm việc. Các bài viết được biên tập một cách chi tiết, linh hoạt để giúp bạn đọc có thể tiếp cận một cách dễ dàng nhất. Hi vọng nó sẽ có ích hoặc mang lại một góc nhìn khác cho bạn[...]

2 bình luận

  • Anh ơi phần mà extension method cùng chữ ký nhưng thuộc 2 namespace khác nhau thì cụ thể mình gọi như nào ạ. VD em gọi string s=””; s.A.ExtMethod(); s.B.ExtMethod(); thì không gọi được ạ

    • Như ở trên a có ghi đó:
      (1) Em cần using namespace tại nơi muốn sử dụng method extension của namespace đó
      (2) Nếu tên của method extension trong namespace được using ở (1) không trùng tên với method extension trong namespace hiện thì thì em sử dụng như bình thường,
      còn tr/h trùng thì em cần chỉ rõ method extension của namespace nào khi gọi sử dụng bằng cách TênNamespace.TênExtensionMethod()

Translate »