วิธีการทำงานกับวิธีการขยายใน 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.");