ผ่าน a ref
หากคุณต้องการเปลี่ยนสิ่งที่เป็นวัตถุ:
TestRef t = new TestRef();
t.Something = "Foo";
DoSomething(ref t);
void DoSomething(ref TestRef t)
{
t = new TestRef();
t.Something = "Not just a changed t, but a completely different TestRef object";
}
หลังจากเรียก DoSomething t
ไม่ได้อ้างถึงต้นฉบับnew TestRef
แต่หมายถึงวัตถุที่แตกต่างอย่างสิ้นเชิง
string
ซึ่งอาจเป็นประโยชน์เกินไปถ้าคุณต้องการที่จะเปลี่ยนค่าของวัตถุที่ไม่เปลี่ยนรูปเช่นการ คุณไม่สามารถเปลี่ยนค่าของstring
ครั้งเดียวที่มันถูกสร้างขึ้น แต่ด้วยการใช้ a ref
คุณสามารถสร้างฟังก์ชั่นที่เปลี่ยนสตริงสำหรับอีกอันที่มีค่าต่างกัน
แก้ไข: ตามที่คนอื่นพูดถึง มันไม่ควรใช้ref
เว้นแต่จะจำเป็น การใช้ref
ให้อิสระกับวิธีการในการเปลี่ยนอาร์กิวเมนต์สำหรับสิ่งอื่นผู้โทรของวิธีจะต้องถูกเข้ารหัสเพื่อให้แน่ใจว่าพวกเขาจัดการความเป็นไปได้
นอกจากนี้เมื่อชนิดพารามิเตอร์เป็นวัตถุแล้วตัวแปรวัตถุจะทำหน้าที่อ้างอิงถึงวัตถุเสมอ ซึ่งหมายความว่าเมื่อใช้ref
คำหลักคุณจะได้รับการอ้างอิงถึงการอ้างอิง สิ่งนี้อนุญาตให้คุณทำสิ่งต่าง ๆ ตามที่อธิบายไว้ในตัวอย่างด้านบน แต่เมื่อชนิดพารามิเตอร์เป็นค่าดั้งเดิม (เช่นint
) ดังนั้นหากพารามิเตอร์นี้ถูกกำหนดให้ภายในวิธีการค่าของอาร์กิวเมนต์ที่ถูกส่งผ่านจะมีการเปลี่ยนแปลงหลังจากที่วิธีการส่งกลับ:
int x = 1;
Change(ref x);
Debug.Assert(x == 5);
WillNotChange(x);
Debug.Assert(x == 5); // Note: x doesn't become 10
void Change(ref int x)
{
x = 5;
}
void WillNotChange(int x)
{
x = 10;
}