Пройдіть, 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
, а посилається на зовсім інший об’єкт.
Це також може бути корисно, якщо ви хочете змінити значення незмінного об'єкта, наприклад, a 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;
}