Вам необходимо понять разницу между передачей по ссылке , передачей по значению и передачей по значению .
В примере кода, который вы опубликовали, вы передаете ссылку объекту List<int>
с значением . Это означает, что вы можете изменить объект, на который указывает ссылка, и вызывающий код увидит эти изменения. Однако сама ссылка передается по значению, поэтому, если вы измените ссылку так, чтобы она указывала на другой объект в целом, вызывающий код не увидит изменений.
Когда вы используете ключевое слово ref
, вы передаете ссылку непосредственно по ссылке. Это означает, что вы можете не только изменить объект, на который указывает ссылка, но вы также можете изменить саму ссылку.
Рассмотрим этот пример:
class Program
{
static void Main()
{
int foo = 0;
DoSomething1(foo);
Console.WriteLine(foo); // Outputs 0.
DoSomething1(ref foo);
Console.WriteLine(foo); // Outputs 1.
var bar = new List<int>();
DoSomething2(bar);
Console.WriteLine(bar.Count); // Outputs 1.
DoSomething2(ref bar);
Console.WriteLine(bar.Count); // Outputs 0.
}
// Pass by value.
static void DoSomething1(int number)
{
// Can't modify the number!
number++;
}
// Pass by value.
static void DoSomething1(ref int number)
{
// Can modify the number!
number++;
}
// Pass reference by value.
static void DoSomething2(List<int> list)
{
// Can't change the reference, but can mutate the object.
list.Add(25);
}
// Pass reference by reference.
static void DoSomething2(ref List<int> list)
{
// Can change the reference (and mutate the object).
list = new List<int>();
}
}