C # จัดให้มีref
และout
คำหลักเพื่อสร้างอาร์กิวเมนต์ที่จะส่งผ่านโดยการอ้างอิง ความหมายของทั้งสองนั้นคล้ายกันมาก ข้อแตกต่างเพียงอย่างเดียวคือการเริ่มต้นของตัวแปร flaged:
ref
ต้องการตัวแปรที่จะเริ่มต้นก่อนที่จะส่งผ่านไปยังฟังก์ชั่นout
ไม่ได้out
ต้องการตัวแปรที่จะเริ่มต้นภายในฟังก์ชั่นref
ไม่ได้
กรณีการใช้งานของคำหลักสองคำนี้ก็เกือบจะเหมือนกันและการใช้งานที่บ่อยเกินไปของพวกเขาคือฉันเชื่อว่ามีกลิ่นรหัส (แม้ว่าจะมีกรณีการใช้ที่ถูกต้องเช่นTryParse
และTryGetValue
รูปแบบ)
ด้วยเหตุนี้ใครบางคนสามารถอธิบายได้ว่าทำไมมีเครื่องมือสองอย่างที่คล้ายกันมากใน C # สำหรับกรณีการใช้งานที่แคบมาก?
นอกจากนี้ในMSDNมีการระบุว่าพวกเขามีพฤติกรรมการใช้งานที่แตกต่างกัน:
แม้ว่าคีย์เวิร์ด ref และ out จะทำให้เกิดพฤติกรรมรันไทม์ที่แตกต่างกัน แต่ก็ไม่ได้พิจารณาว่าเป็นส่วนหนึ่งของลายเซ็นเมธอดในเวลารวบรวม
พฤติกรรมรันไทม์ของพวกเขาแตกต่างกันอย่างไร
ข้อสรุป
คำตอบทั้งสองนั้นดูถูกต้องขอบคุณทั้งคู่ ฉันยอมรับjmorenoเพราะชัดเจนกว่า
ref
ใน C ++; เพื่อชี้ไปยังตัวชี้วัตถุ (หรือดั้งเดิม) ในคำถาม ieInt32.TryParse(myStr, out myInt)
(C #) คือ "ดำเนินการ" เช่นเดียวกับint32_tryParse(myStr, &myInt)
(C) ข้อแตกต่างเพียงข้อ จำกัด บางประการที่คอมไพเลอร์บังคับใช้เพื่อป้องกันข้อบกพร่อง (ฉันจะไม่โพสต์สิ่งนี้เป็นคำตอบเพราะฉันอาจผิดเกี่ยวกับวิธีการทำงานเบื้องหลัง แต่นี่เป็นวิธีที่ฉันจินตนาการว่ามันใช้งานได้ (เพราะสมเหตุสมผล)]