Передайте 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
после его создания. Но, используя 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;
}