Vượt qua ref
nếu bạn muốn thay đổi đối tượng là gì:
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";
}
Sau khi gọi DoS Something, t
không đề cập đến bản gốcnew TestRef
, mà đề cập đến một đối tượng hoàn toàn khác.
Điều này cũng có thể hữu ích nếu bạn muốn thay đổi giá trị của một đối tượng bất biến, ví dụ a string
. Bạn không thể thay đổi giá trị của một string
khi nó đã được tạo. Nhưng bằng cách sử dụng a ref
, bạn có thể tạo một hàm thay đổi chuỗi cho một chuỗi khác có giá trị khác.
Chỉnh sửa: Như những người khác đã đề cập. Nó không phải là một ý tưởng tốt để sử dụng ref
trừ khi nó là cần thiết. Sử dụngref
cho phép phương thức tự do thay đổi đối số cho một thứ khác, người gọi phương thức sẽ cần được mã hóa để đảm bảo họ xử lý khả năng này.
Ngoài ra, khi kiểu tham số là một đối tượng, thì các biến đối tượng luôn đóng vai trò tham chiếu đến đối tượng. Điều này có nghĩa là khi ref
từ khóa được sử dụng, bạn đã có một tham chiếu đến một tham chiếu. Điều này cho phép bạn làm những việc như được mô tả trong ví dụ nêu trên. Nhưng, khi loại tham số là một giá trị nguyên thủy (ví dụ int
), thì nếu tham số này được gán cho trong phương thức, giá trị của đối số được truyền vào sẽ được thay đổi sau khi phương thức trả về:
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;
}