วิธีการสร้าง Prototype Methods ใน C#.NET

ในฐานะนักพัฒนา เรามักพบว่าตัวเองต้องเลือกใช้ภาษาโปรแกรมต่างๆ และฟีเจอร์ของพวกมันเพื่อเพิ่มประสิทธิภาพของโค้ด หากคุณมีพื้นฐานจาก JavaScript คุณอาจคุ้นเคยกับแนวคิดของ prototype methods ซึ่งอนุญาตให้คุณเพิ่มวิธีการใหม่ๆ ให้กับวัตถุที่มีอยู่ ซึ่งช่วยเพิ่มความสามารถในการทำงานโดยไม่ต้องเปลี่ยนแปลงฐานข้อมูลโค้ดเดิม อย่างไรก็ตาม เมื่อต้องสลับไปใช้ C#.NET สิ่งต่างๆ มิได้ง่ายดายขนาดนั้น

ความท้าทาย: การเพิ่ม Prototype Methods ใน C#.NET

คุณอาจสงสัยว่า: “ฉันจะสร้าง prototype methods ใน C#.NET ได้อย่างไร?” ต่างจาก JavaScript ที่อนุญาตให้เพิ่มวิธีการได้อย่างไดนามิกให้กับวัตถุที่มีอยู่ C#.NET ไม่สนับสนุนฟีเจอร์นี้โดยตรง ใน C# เมื่อคลาสถูกคอมไพล์แล้ว คุณไม่สามารถเพิ่มวิธีการแบบไดนามิกให้กับมันได้ เว้นแต่จะเปลี่ยนแปลงซอร์สของคลาสโดยตรง

ตัวอย่างจาก JavaScript

ใน JavaScript คุณสามารถเพิ่มวิธีการให้กับ String prototype ได้อย่างง่ายดาย นี่คือวิธีการที่คุณจะนำเสนอวิธีการ trim ที่ง่าย:

String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g,"");
}

โค้ดนี้อนุญาตให้คุณเรียกใช้วิธีการ trim บนตัวอย่างของสตริงใดๆ ได้อย่างสะดวกสบาย โดยลบช่องว่างที่อยู่ทั้งสองด้านออก

วิธีกำหนด: การใช้ Extension Methods ใน C#.NET

แม้ว่าคุณจะไม่สามารถเพิ่มวิธีการแบบไดนามิกให้กับสตริงใน C#.NET ได้เหมือนกับ JavaScript แต่คุณสามารถบรรลุฟังก์ชันที่คล้ายกันได้โดยใช้ extension methods ที่ถูกนำเสนอใน C# 3.0 Extension methods อนุญาตให้คุณ “เพิ่ม” วิธีการใหม่ๆ ให้กับประเภทที่มีอยู่โดยไม่ต้องปรับเปลี่ยนซอร์สโค้ดของพวกมันหรือใช้การสืบทอด

คู่มือทีละขั้นตอนในการสร้าง Extension Method

นี่คือวิธีการสร้างวิธีการ trim สำหรับสตริงใน C#.NET:

  1. สร้างคลาสสแตติกสำหรับ Extension Methods เริ่มต้นด้วยการสร้างคลาสสแตติกซึ่งจะบรรจุ extension methods

    public static class StringExtensions
    {
        public static String trim(this String s)
        {
            return s.Trim();
        }
    }
    
    • คำสำคัญ this ก่อนพารามิเตอร์แรกแสดงให้เห็นว่านี่คือวิธีการ extension สำหรับประเภท String
  2. ใช้ Extension Method หลังจากกำหนด extension method ของคุณแล้ว คุณสามารถใช้มันได้เหมือนกับวิธีการตัวอย่างใดๆ:

    String s = "  Test  ";
    s = s.trim();
    
    • วิธีนี้ดูเหมือนว่าคุณกำลังเรียกใช้วิธีการโดยตรงบนตัวอย่างของสตริง

เข้าใจวิธีการทำงาน

แม้ว่ามันจะดูเหมือนว่าคุณกำลังแนะนำวิธีการใหม่ แต่เบื้องหลัง โค้ดนี้จะคอมไพล์เป็น:

String s = "  Test  ";
s = StringExtensions.trim(s);

นี่หมายความว่าคุณไม่ได้เพิ่มวิธีการโดยตรงให้กับคลาส String แต่กำลังสร้างวิธีการช่วยที่ทำงานร่วมกับ String

สรุป

การสร้างวิธีการที่คล้ายคลึงกับ prototype ใน C#.NET สามารถทำได้อย่างมีประสิทธิภาพผ่าน extension methods ในขณะที่คุณอาจรู้สึกขาดความยืดหยุ่นที่ JavaScript มีให้ extension methods ก็ให้วิธีการที่สะอาดและมีประสิทธิภาพในการขยายฟังก์ชันการทำงานของคลาสที่มีอยู่

ความคิดสุดท้าย

ก่อนที่จะดำดิ่งหรือตั้งใจสร้าง extension methods เป็นสิ่งสำคัญที่จะต้องเข้าใจเป้าหมายของคุณให้ชัดเจน อาจมีวิธีการอื่นๆ ใน C#.NET ที่ทำให้ได้ผลลัพธ์เดียวกันได้อย่างมีประสิทธิภาพมากกว่า หากคุณพบว่าตัวเองต้องการฟังก์ชันที่ไม่มีอยู่ในคลาส ให้นึกถึงการใช้ utility methods หรือ helper classes เพื่อให้โค้ดของคุณสะอาดและบำรุงรักษาง่าย

หากคุณมีคำถามเพิ่มเติมเกี่ยวกับการทำงานกับ C#.NET หรือความท้าทายอื่นๆ ในการเขียนโปรแกรม โปรดอย่าลังเลที่จะถาม!