Vượt qua một ref
nếu bạn muốn thay đổi những gì đối tượng là:
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 DoSomething, t
không đề cập đến bản gốc new TestRef
, nhưng đề cập đến một đối tượng hoàn toàn khác nhau.
Điều này cũng 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 ref
, bạn có thể tạo một hàm thay đổi chuỗi cho 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ụng ref
cho phép phương thức tự do thay đổi đối số cho cái gì khác, người gọi của 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 loại tham số là đối tượng, thì các biến đối tượng luôn hoạt động như tham chiếu đến đối tượng. Điều này có nghĩa là khi từ khóa ref
được sử dụng, bạn có tham chiếu đến 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ụ ở trên. Tuy nhiên, khi các loại tham số là một giá trị nguyên thủy (ví dụ int
), sau đó nếu tham số này được gán cho trong phương pháp này, giá trị của lập luận rằng đã được thông qua sẽ được thay đổi sau khi trở về phương pháp:
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;
}
Nguồn
2008-10-09 11:52:51
Cho dù bạn đang chuyển một giá trị tham chiếu hay giá trị loại giá trị, hành vi mặc định sẽ được chuyển theo giá trị. Bạn chỉ cần hiểu rằng với các loại tham chiếu, giá trị bạn đang truyền * là * một tham chiếu. Điều này không giống như tham chiếu * by *. –