PVA – Archives

Sưu tầm những bài viết hay trên internet…

Sử dụng Extension Methods trong .NET >= 3.0

Như các bạn đã biết thì khi ta muốn thêm một method nào đó vào một class thì bạn phải sửa code và biên dịch lại assembly chứa class đó. Rõ ràng điều này chỉ “tạm chấp nhận” khi code đó chính là do bạn tạo ra, do bạn giữ bản quyền chứ không thể khi ta sử dụng các library của người khác.
Thật ra, nếu nói cho đúng thì có 2 cách mà bạn có thể làm việc xoay quanh vấn đề này :

  • Thứ nhất. Inherit class bạn muốn thêm method.
  • Thứ hai. Tạo một static class mới với đầu vào là class muốn thêm method và đầu ra là class sau khi bạn đã thao tác trong method này. (Thường chúng ta hay dùng kiểu này).

Tuy nhiên chúng ta hãy xem xét các mặt không có lợi khi áp dụng các phương thức trên :

  • Phương thức 1 : Vấn đề xảy ra khi class bạn muốn thêm method không cho inherit. Tiêu biểu là sealed classes như String, Int16, Int32, … Hơn nữa, giả sử inherit được thì nó lại gây khó khăn khi sử dụng, ví dụ như thay vì dùng một cách tự nhiên là String thì bạn phải sử dụng MyString, ModedString, …. Rõ ràng là không hề tự nhiên.
  • Phương thức 2 : Có thể tạm chấp nhận được nhưng nó đi ngược với tư tưởng hướng đối tượng, cách viết method sẽ trở về “nguyên thủy” khi làm việc với struct, function, … Bạn sẽ phải String x = MyClass.Modify(inputString) thay vì x = x.Modify()

Và điều này đã được giải quyết khá gọn gàng trong .NET 3.5 (thực ra là từ .NET 3.0) với Extenstion Methods

Cách sử dụng Extension Methods

Khi sử dụng Extension Methods bạn cần chú ý 3 điểm :

  • Class chứa extension method phải là static class
  • Extension method phải là static method
  • Sử dụng từ khóa this khi truyền đối tượng vào

Extension Method thêm được viết ra như một static method nhưng được gọi theo cú pháp gọi một hàm của một đối tượng (instance). Tham số đầu tiền của Extension Method được dùng để xác định kiểu (Type) sẽ áp dụng với từ “this” được dùng ở đầu tham số. Hãy xem ví dụ dưới đây:

  1. namespace ExtensionMethods
  2. {
  3. public static class MyExtensions
  4. {
  5. public static int WordCount(this String str)
  6. {
  7. return str.Split(new char[] { ‘ ‘, ‘.’, ‘?’ }, StringSplitOptions.RemoveEmptyEntries).Length;
  8. }
  9. }
  10. }

Và để sử dụng hàm mới viết thêm này, bạn cần thêm chỉ thị using vào đầu tập tin.

  1. using ExtensionMethods;

Và bạn có thể dùng ở đâu đó, với đúng kiểu (Type) bạn đã viết cho hàm WordCount:

  1. string s = “Hello Extension Methods”;
  2. int i = s.WordCount();

Như vậy, WordCount đã trở thành một hàm bổ sung cho kiểu String và từ nay, bạn không cần phải nhớ hàm WordCount nằm trong thư viện dùng thêm nào của bạn.
Tham khảo: http://www.jbngan.com/post/Su-dung-Extension-Methods-trong-NET-35.aspx

http://hp-aptech.edu.vn/hpa/programming/archive/2009/08/05/cach-su-dung-extension-methods-trong-net.aspx

About these ads

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.

%d bloggers like this: