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