Extension Method คืออะไร

ใน .NET Framework 3.5 ได้แนะนำ language feature ใหม่ที่เรียกว่า Extension Method
เป็นสิ่งที่ทำให้เราสามารถเรียก static method (หรือ Function ใน Module) ได้ราวกับมันเป็น method ของคลาสอะไรก็ได้ที่เราต้องการ

ตามปกติแล้วถ้าเราอยากเพิ่มเมธอดให้กับคลาสอะไรบางอย่าง เราอาจทำได้โดยการ inherit คลาสนั้นมา แล้วก็เขียนเมธอดเองในคลาสลูกนั้น
แต่ Extension Method อนุญาตให้เราเขียน static method ขึ้นมาลอยๆ แล้วนำไปเรียกใช้กับคลาสที่เราต้องการได้ทันที

ตัวอย่างเช่น
เราต้องการทำ function สำหรับ format date ให้เป็น string
สมมติเรามี Module อยู่ตัวนึง ข้างในมีฟังค์ชั่น

Public Function TestFormatDate(ByVal d As Date) As String
    Return d.Day & "/" & d.Month & "/" & d.Year
End Function

ปกติเวลาจะเรียกใช้ก็คือ

Dim d as Date = Now
Console.WriteLine(TestFormatDate(d))

แต่เราสามารถทำฟังค์ชั่นนี้ให้กลายเป็น Extension Method ได้โดยการติด Attribute Exntesion เข้าไปที่หัวฟังค์ชั่น
ซึ่ง ExtensionAttribute นี้อยู่ใน Namespace System.Runtime.CompilerServices
ดังนั้นโดยรวมแล้ว code ก็จะเป็น

Imports System.Runtime.CompilerServices

Public Module TestModule
    <Extension()> _
    Public Function TestFormatDate(ByVal d As Date) As String
        Return d.Day & "/" & d.Month & "/" & d.Year
    End Function
End Module

หรือ syntax ในภาษา c# ไม่ต้องใช้ Attribute อะไร เพียงแต่ใช้ keyword ว่า this

public static class TestModule
{
    public static string TestFormatDate(this DateTime d)
    {
        return d.Day + "/" + d.Month + "/" + d.Year;
    }
}

ซึ่งจะทำให้เราสามารถเรียกใช้ฟังค์ชั่นแบบนี้ได้

Dim d as Date = Now
Console.WriteLine(d.TestFormatDate())

สังเกตว่า parameter ตัวแรกจะหายไป เนื่องจากเมธอดนี้ถือว่ามันจะไปเกาะกับคลาสประเภทนั้นๆ ซึ่งในที่นี้ก็คือคลาส Date
การเขียนแบบนี้จะช่วยให้ code สามารถอ่านได้ง่ายขึ้น เขียนได้ลื่นไหลไม่ติดขัดมากขึ้น เพราะพอกดจุด “.”
Intellisense ของ Visual Studio มันก็แสดงรายการเมธอดที่เป็นไปได้ขึ้นมาให้เองทั้งหมด
ไม่ต้องย้อนกลับไปพิมพ์ชื่อฟังค์ชั่น ก่อนชื่อตัวแปร

About these ads

One Response to “Extension Method คืออะไร”

  1. Witsanukam Says:

    ยอดเยี่ยมมากครับ เป็นกำลังใจให้


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.

Join 147 other followers

%d bloggers like this: