วิธีการทำงานกับวิธีการขยายใน C #

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

วิธีการส่วนขยายทั่วไปใน. Net รวมถึงตัวดำเนินการแบบสอบถามมาตรฐาน LINQ ที่เพิ่มความสามารถในการสืบค้นเพิ่มเติมให้กับSystem.Collections.IEnumerable and System.Collections.Generic.IEnumerableชนิด โปรดทราบว่าคุณสามารถใช้ประโยชน์จากวิธีการขยายเพื่อขยายคลาสหรืออินเทอร์เฟซ แต่คุณไม่สามารถแทนที่เมธอดของพวกเขาได้ สถานะ MSDN: "วิธีการขยายช่วยให้คุณสามารถ" เพิ่ม "เมธอดให้กับชนิดที่มีอยู่โดยไม่ต้องสร้างชนิดที่ได้รับใหม่การคอมไพล์ใหม่หรือการแก้ไขประเภทดั้งเดิมวิธีการขยายเป็นวิธีการแบบคงที่พิเศษ แต่จะเรียกว่า เป็นวิธีการของอินสแตนซ์ในประเภทขยาย "

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

เมื่อทำงานกับวิธีการขยายโปรดคำนึงถึงประเด็นเหล่านี้:

  • วิธีการขยายต้องเป็นวิธีการคงที่
  • วิธีการขยายต้องอยู่ในคลาสแบบคงที่ - คลาสสามารถมีชื่ออะไรก็ได้
  • พารามิเตอร์ในเมธอดส่วนขยายควรมีคีย์เวิร์ด "this" นำหน้าประเภทที่ต้องการเรียกใช้เมธอดเสมอ

โปรดทราบว่าคุณกำหนดวิธีการขยายในประเภทที่มีลายเซ็นเดียวกันกับวิธีการอื่น ๆ ของประเภทที่คุณขยายวิธีการขยายจะไม่ถูกเรียก

วิธีการเขียนโปรแกรมขยายใน C #

ในส่วนนี้เราจะสำรวจวิธีการตั้งโปรแกรมวิธีการขยายโดยใช้ C # รายการโค้ดต่อไปนี้แสดงให้เห็นว่าเมธอดส่วนขยายมีลักษณะอย่างไร

public static class StringExtensions

    {

        public static bool IsNumeric(this string str)

        {

            double output;

            return double.TryParse(str, out output);

        }

    }

สังเกตพารามิเตอร์แรกของวิธีการขยาย ตามที่ได้กล่าวไปแล้ววิธีการขยายใด ๆ ควรเป็นแบบคงที่และควรมีคีย์เวิร์ด "this" นำหน้าพารามิเตอร์ที่คุณต้องการให้เรียกใช้เมธอด เมื่อคุณระบุคีย์เวิร์ด "this" ในรายการพารามิเตอร์ตามที่แสดงในตัวอย่างด้านบนคุณจะแจ้งคอมไพลเลอร์ว่ามีการกำหนดวิธีการขยายสำหรับคลาสสตริง

นี่คือวิธีที่คุณสามารถใช้วิธีการขยาย IsNumeric ในอินสแตนซ์สตริง

static void Main(string[] args)

        {

            string str = "100";

            if (str.IsNumeric())

                Console.WriteLine("The string object named str contains numeric value.");

            Console.Read();

        }

เมื่อคุณรันโปรแกรมข้างต้นข้อความ ("อ็อบเจกต์สตริงชื่อ str มีค่าตัวเลข" จะแสดงในหน้าต่างคอนโซล

คุณสามารถใช้วิธีการขยายเพื่อแทรกฟังก์ชันการทำงานใหม่ผ่านวิธีการไปยังประเภทได้โดยไม่จำเป็นต้องปรับเปลี่ยนรับหรือคอมไพล์ประเภทเดิมซ้ำ ดังที่ฉันได้กล่าวไว้ก่อนหน้านี้วิธีการขยายยังสามารถใช้กับประเภทค่าได้ มาดูตัวอย่างกันว่าจะทำได้อย่างไร

คลาสต่อไปนี้ชื่อ IntegerExtensions มีเมธอดส่วนขยายชื่อ IsEven ที่คืนค่าจริงหากจำนวนเต็มที่เรียกว่าเป็นเลขคู่เป็นเท็จอย่างอื่น

public static class IntegerExtensions

    {

        public static bool IsEven(this int i)

        {

            return ((i % 2) == 0);

        }

    }

และนี่คือวิธีที่คุณสามารถใช้วิธีการขยาย IsEven กับจำนวนเต็ม

int n = 2;

if(n.IsEven())

 Console.WriteLine("The value of the integer is even.");