โพสต์ต้นฉบับถูกโพสต์บน GCDN เนื่องจาก GCDN ได้ทำการปรับเปลี่ยนการผสานรวม และตอนนี้มุ่งเน้นไปที่การแลกเปลี่ยนผลิตภัณฑ์และเหตุผลอื่นๆ บล็อก GCDN จึงถูกปิด ฉันจึงต้องย้ายบางส่วนที่เป็นประโยชน์มาที่นี่
13 สิงหาคม 2552 เวลา 12:29 น. โดยกระพริบตา
เมื่อเขียนบล็อกนี้ CyljXu ถามคำถามฉันวันนี้: จะเรียกเมธอดที่มีพารามิเตอร์ ref หรือ out ผ่านการไตร่ตรองได้อย่างไร คิดว่าคนอื่นอาจจะเจอปัญหานี้ก็เลยอยากจะบันทึกไว้ให้ผู้อ่านค้นหาในอนาคต
สิ่งนี้อธิบายไว้บน MSDN โปรดดูเมธอด MethodBase.Invoid
การเรียกใช้วัตถุสาธารณะ (พารามิเตอร์วัตถุ obj วัตถุ [])
วิชวลซี++
สาธารณะ
: วัตถุเสมือน ^ วิงวอน (วัตถุ ^ obj, arrayJ#
สาธารณะ
การเรียกใช้วัตถุขั้นสุดท้าย (พารามิเตอร์วัตถุ obj วัตถุ [])
เจสคริปต์
สาธารณะ
สุดท้าย
การทำงาน
เรียกใช้( obj : วัตถุ, พารามิเตอร์ : วัตถุ[] ) : วัตถุ
พารามิเตอร์
ประเภทวัตถุ: System.Object
วัตถุที่เรียกใช้เมธอดหรือคอนสตรัคเตอร์ หากวิธีการเป็นแบบคงที่ พารามิเตอร์นี้จะถูกละเว้น ถ้าตัวสร้างเป็นแบบคงที่ พารามิเตอร์นี้ต้องเป็นการอ้างอิงที่เป็นโมฆะ (ไม่มีสิ่งใดใน Visual Basic) หรืออินสแตนซ์ของคลาสที่ตัวสร้างถูกกำหนดไว้
ประเภทพารามิเตอร์: System.Object[]
รายการพารามิเตอร์ของเมธอดหรือตัวสร้างที่จะเรียก นี่คืออาร์เรย์ของอ็อบเจ็กต์ที่มีหมายเลข ลำดับ และประเภทเดียวกันกับพารามิเตอร์ของเมธอดหรือตัวสร้างที่ถูกเรียก หากไม่มีพารามิเตอร์ พารามิเตอร์ควรเป็นการอ้างอิงที่เป็นโมฆะ (ไม่มีสิ่งใดใน Visual Basic)
ถ้าวิธีการหรือตัวสร้างที่แสดงโดยอินสแตนซ์นี้ใช้พารามิเตอร์การอ้างอิง (ByRef ใน Visual Basic) พารามิเตอร์ไม่จำเป็นต้องมีแอตทริบิวต์พิเศษใด ๆ เมื่อฟังก์ชันนี้ใช้ในการเรียกวิธีการหรือตัวสร้าง หากวัตถุในอาร์เรย์ไม่ได้เตรียมใช้งานด้วยค่าอย่างชัดเจน วัตถุนั้นจะมีค่าเริ่มต้นสำหรับประเภทวัตถุนั้น สำหรับองค์ประกอบของประเภทการอ้างอิง ค่าจะเป็นการอ้างอิง null (ไม่มีสิ่งใดใน Visual Basic) สำหรับองค์ประกอบของประเภทค่า ค่าจะเป็น 0, 0.0 หรือเท็จ ขึ้นอยู่กับประเภทองค์ประกอบเฉพาะ
แล้วจะโทรและจัดการค่าที่ส่งผ่านได้อย่างไร? โปรดดูตัวอย่างต่อไปนี้:
1 คลาส โปรแกรม 2 { 3 โมฆะคงที่ Main(string[] args) 4 { 5 string content = "main"; //#1 ตัวแปร 6 MethodInfo testMethod = typeof(Program).GetMethod("TestMethod", 7 BindingFlags.Static | BindingFlags.NonPublic); 8 if (testMethod != null) 9 {10 // วิธีต่อไปนี้ไม่สามารถนำเนื้อหากลับมาได้ 11 // --------------------- ----------------12 testMethod.Inrigg(null, new object[] { content /* #1ตัวแปร */ });13 Console.WriteLine(เนื้อหา); 1 ตัวแปร เอาต์พุตคือ: main14 // --------------------------------------------- ----15 16 17 วัตถุ [] invokeArgs = วัตถุใหม่ [] { เนื้อหา /* #1 ตัวแปร */ };18 testMethod.Invive(null, invokeArgs);19 เนื้อหา = (สตริง)inurgeArgs[0]; ตัวแปร #2, บายพาสจากการเรียกใช้, ตั้งค่าเป็น content.20 Console.WriteLine(content); // #2 ตัวแปร, เอาต์พุตคือ: test21 }22 }23 24 static void TestMethod(ref string arg)25 {26 arg = "test "; // ตัวแปร #2, ต้องการข้ามไปยังกระบวนการหลัก27 }28 }
ให้เป็นเครื่องหมายอะพอสทรอฟีที่เปลี่ยน “เป็นไปไม่ได้” เป็น “ฉันเป็นไปได้”
-------------------------------------------------- -------------------------------------------------- --
บล็อกของ WinkingZhang ( http://winkingzhang.cnblogs.com )
GCDN( http://gcdn.grapecity.com/cs )
-