Пожалуйста, обратитесь к следующему примеру:
public class Foo
{
public string Name { get; set; }
}
public class Bar
{
public Foo MyFoo { get; set; }
public Bar(Foo paramFoo)
{
this.MyFoo = paramFoo;
}
}
И эта последовательность:
Foo f = new Foo();
f.Name = "First Foo";
System.Diagnostics.Debug.WriteLine(f.Name);
Bar b = new Bar(f);
System.Diagnostics.Debug.WriteLine(b.MyFoo.Name);
b.MyFoo.Name = "Renaming Bar Name";
System.Diagnostics.Debug.WriteLine(f.Name);
System.Diagnostics.Debug.WriteLine(b.MyFoo.Name);
Выход будет:
First Foo
First Foo
Renaming Bar Name
Renaming Bar Name
В этом случае, мы» переходя f
ссылка t o Bar
ctor, поэтому f
и MyFoo
оба указывают на тот же адрес памяти, , но это разные переменные. Это означает, что, если мы делаем следующее
b.MyFoo = new Foo();
b.MyFoo.Name = "Yet another foo";
System.Diagnostics.Debug.WriteLine(f.Name);
System.Diagnostics.Debug.WriteLine(b.MyFoo.Name);
Выход будет
Renaming Bar Name
Yet another foo
Чтобы изменить это поведение, вы должны использовать ключевое слово ref
, поэтому вы отправляете указатель на эту переменную.
Посмотрите на http://jonskeet.uk/csharp/parameters.html. – DWright
В этом конкретном примере модификатор 'ref' фактически ничего не делает, поскольку вы не присваиваете ничего обратно' b'. Копирование ссылки всегда выполняется, и как переменная, так и параметр в конечном итоге указывают на тот же объект. – Alejandro