นี่คือไวยากรณ์สำหรับการประกาศวิธีการขยายซึ่งเป็นคุณลักษณะใหม่ของ C # 3.0
วิธีการขยายคือรหัสชิ้นส่วนคอมไพเลอร์ส่วน "มายากล" ซึ่งคอมไพเลอร์ด้วยความช่วยเหลือของ intellisense ใน Visual Studio ทำให้ดูเหมือนว่าวิธีการขยายของคุณมีให้ใช้งานได้จริงเป็นวิธีอินสแตนซ์ของวัตถุที่เป็นปัญหา
ผมขอยกตัวอย่าง
ไม่มีเมธอดในคลาส String ที่มีชื่อว่า GobbleGobble ดังนั้นมาสร้างวิธีการขยาย:
public static class StringExtensions
{
public static void GobbleGobble(this string s)
{
Console.Out.WriteLine("Gobble Gobble, " + s);
}
}
ชื่อคลาสเป็นเพียงหลักการตั้งชื่อของฉันไม่จำเป็นต้องตั้งชื่อแบบนั้น แต่ต้องเป็นแบบคงที่เช่นเดียวกับวิธีการ
หลังจากประกาศวิธีการข้างต้นคุณสามารถพิมพ์สิ่งนี้ใน Visual Studio:
String s = "Turkey Baster!";
s.
หลังจากจุดรอสำหรับ intellisense และสังเกตว่ามีวิธี GobbleGobble อยู่ที่นั่นกรอกรหัสดังนี้:
String s = "Turkey Baster!";
s.GobbleGobble();
สำคัญ : คลาสที่ประกาศเมธอดส่วนขยายต้องพร้อมใช้งานสำหรับคอมไพลเลอร์และตัวประมวลผล Intellisense เพื่อให้ intellisense แสดงเมธอด หากคุณพิมพ์ GobbleGobble ด้วยตนเองและใช้ทางลัดCtrl+ .จะไม่ช่วยให้คุณใช้คำสั่งลงในไฟล์ได้อย่างถูกต้อง
สังเกตว่าพารามิเตอร์ของเมธอดหายไป คอมไพเลอร์จะเคลื่อนที่ไปรอบ ๆ บิตที่สำคัญอย่างเงียบ ๆ ซึ่ง ได้แก่ :
String s = "Turkey Baster!";
s.GobbleGobble();
^ ^
| +-- the compiler will find this in the StringExtensions class
|
+-- will be used as the first parameter to the method
ดังนั้นโค้ดข้างต้นจะถูกแปลงโดยคอมไพเลอร์เป็น:
String s = "Turkey Baster!";
StringExtensions.GobbleGobble(s);
ดังนั้นในเวลาโทรไม่มีอะไรวิเศษเกี่ยวกับเรื่องนี้มันเป็นเพียงการเรียกร้องให้ใช้วิธีการแบบคงที่
โปรดทราบว่าหากเมธอดส่วนขยายของคุณประกาศพารามิเตอร์มากกว่าหนึ่งพารามิเตอร์ตัวแรกเท่านั้นที่รองรับthis
ตัวปรับแต่งและส่วนที่เหลือจะต้องถูกระบุเป็นส่วนหนึ่งของการเรียกเมธอดตามปกติ:
public static void GobbleGobble(this string value, string extra)
{ | |
... | |
} | |
| |
+--------------------------------------------+ |
| |
v |
s.GobbleGobble("extra goes here"); |
^ |
| |
+-----------------------------------+
มีการเพิ่มวิธีการขยายในส่วนหนึ่งเนื่องจาก Linq โดยที่ไวยากรณ์ Linq ของ C # จะค้นหาวิธีการขยายที่มีชื่อเหมาะสมสำหรับวัตถุที่เล่นซึ่งหมายความว่าคุณสามารถ "แนะนำ" Linq-support ในคลาสประเภทใดก็ได้โดยเพียงแค่ประกาศนามสกุลที่ถูกต้อง วิธีการ แน่นอนว่าการสนับสนุน Linq เต็มรูปแบบนั้นทำงานได้มาก แต่ก็เป็นไปได้
นอกจากนี้วิธีการขยายด้วยตัวเองก็มีประโยชน์มากดังนั้นโปรดอ่านต่อไป
นี่คือลิงค์บางส่วน: