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;
}
Независимо от того, передаете ли вы ссылку или значение типа значения, поведение по умолчанию должно проходить по значению. Вам просто нужно понять, что с ссылочными типами значение, которое вы передаете *, является * ссылкой. Это не то же самое, что передавать * по * ссылке. – 2008-10-09 12:04:05