ฉันพบรหัส C # หลายครั้งเช่น:
public static int Foo(this MyClass arg)
ฉันไม่สามารถค้นหาคำอธิบายความthis
หมายของคำหลักได้ในกรณีนี้ ข้อมูลเชิงลึกใด ๆ
ฉันพบรหัส C # หลายครั้งเช่น:
public static int Foo(this MyClass arg)
ฉันไม่สามารถค้นหาคำอธิบายความthis
หมายของคำหลักได้ในกรณีนี้ ข้อมูลเชิงลึกใด ๆ
คำตอบ:
นี้เป็นวิธีขยาย ดูคำอธิบายที่นี่
วิธีการขยายช่วยให้นักพัฒนาสามารถเพิ่มวิธีการใหม่ในสัญญาสาธารณะของประเภท CLR ที่มีอยู่โดยไม่ต้อง sub-class หรือคอมไพล์ชนิดเดิม วิธีการขยายช่วยผสมผสานความยืดหยุ่นของการสนับสนุน "การพิมพ์เป็ด" ที่เป็นที่นิยมในภาษาแบบไดนามิกในปัจจุบันด้วยการตรวจสอบประสิทธิภาพและการรวบรวมเวลาของภาษาที่พิมพ์อย่างยิ่ง
วิธีการขยายเปิดใช้งานสถานการณ์ที่มีประโยชน์หลากหลายและช่วยทำให้กรอบการสืบค้น LINQ ที่ทรงพลังจริงๆ ...
หมายความว่าคุณสามารถโทรได้
MyClass myClass = new MyClass();
int i = myClass.Foo();
ค่อนข้างมากกว่า
MyClass myClass = new MyClass();
int i = Foo(myClass);
สิ่งนี้ทำให้สามารถสร้างส่วนต่อประสานที่คล่องแคล่วดังที่ระบุไว้ด้านล่าง
โพสต์บล็อกของ Scott Guอธิบายไว้เป็นอย่างดี
สำหรับฉันคำตอบของคำถามอยู่ในข้อความต่อไปนี้ในโพสต์นั้น:
โปรดทราบว่าวิธีการคงที่ด้านบนมีคำหลัก "นี้" ก่อนอาร์กิวเมนต์พารามิเตอร์ตัวแรกของสตริงประเภท สิ่งนี้บอกคอมไพเลอร์ว่าควรเพิ่มวิธีการเฉพาะนี้ลงในวัตถุประเภท "string" ภายในการนำเมธอด IsValidEmailAddress () ไปใช้ฉันสามารถเข้าถึงคุณสมบัติสาธารณะ / เมธอด / เหตุการณ์ทั้งหมดของอินสแตนซ์สตริงจริงที่วิธีนั้นกำลังถูกเรียกใช้และส่งคืนจริง / เท็จขึ้นอยู่กับว่าเป็นอีเมลที่ถูกต้องหรือไม่
this
คำสำคัญในลายเซ็นวิธี คำตอบอื่น ๆ เพียงพูดอย่างไม่ช่วยเหลือเพียงบอกว่า "เป็นวิธีส่วนขยาย" ฉันไม่เคยเข้าใจอย่างเต็มที่ว่าวิธีการส่วนขยาย "แนบ" กับประเภทที่ขยายจนกว่าจะอ่านคำตอบนี้ได้อย่างไร ขอบคุณ!
นอกจากคำอธิบายของ Preet Sangha:
Intellisense ยังแสดงวิธีการขยายด้วยลูกศรสีน้ำเงิน (เช่นหน้า "รวม <>"):
คุณต้องการ
using the.namespace.of.the.static.class.with.the.extension.methods;
เพื่อให้วิธีการส่วนขยายปรากฏและพร้อมใช้งานหากอยู่ในเนมสเปซที่แตกต่างจากรหัสที่ใช้
ฉันเพิ่งเรียนรู้สิ่งนี้ด้วยตัวเองเมื่อวันก่อน: คำหลักนี้กำหนดวิธีการดังกล่าวว่าเป็นส่วนเสริมของชั้นเรียนที่ได้รับมา ดังนั้นสำหรับตัวอย่างของคุณ MyClass จะมีวิธีการขยายใหม่ที่เรียกว่า Foo (ซึ่งไม่ยอมรับพารามิเตอร์ใด ๆ และส่งกลับค่า int มันสามารถใช้เช่นเดียวกับวิธีสาธารณะอื่น ๆ )
"this" ขยายคลาสถัดไปในรายการพารามิเตอร์
ดังนั้นในวิธีการด้านล่างนี้ "นี้" ขยาย "สตริง" บรรทัดถูกส่งผ่านไปยังฟังก์ชันเป็นอาร์กิวเมนต์ปกติไปยังเมธอด ประชาชนคงสตริง [] SplitCsvLine (สายสตริงนี้)
ในตัวอย่างข้างต้นคลาส "this" กำลังขยายคลาส "String" ที่มีอยู่ภายใน