Я хотел больше узнать о том, как работает ключевое слово ref, поэтому провел следующий эксперимент:
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
var main = new Main { Property = 1 };
var dependent = new Dependent(main);
void ChangeRef(ref Main Oldmain, Main newMain)
{
Oldmain = newMain;
}
ChangeRef(ref main, new Main { Property = 5 });
Assert.AreEqual(5,dependent.Main.Property);
}
}
public class Main
{
public int Property { get; set; }
}
public class Dependent
{
public Dependent(Main main)
{
Main = main;
}
public Main Main { get; set; }
}
Как вы можете видеть, я ожидал, что смогу заменить объект, на который ссылается main, сохраняя при этом ссылку, но тест не проходит и значение по-прежнему равно 1. Может ли кто-нибудь уточнить, почему это не работает, или указать мне место где я могу прочитать больше?
Обновление: как кто-то ответил ниже, но позже удалил. Почему не работает, если я передаю основной объект по ссылке на зависимый в конструкторе? Разве они не должны иметь одинаковую ссылку?
Main
. Вы создалиDependent
со ссылкой на этотMain
. Затем вы создаете совершенно новый файлMain
.dependent
не видит этогоMain
.dependent
не имеет ссылки на переменнуюmain
— она содержит ссылку на объект, на который указываетmain
переменная в этот момент в время. Если указатьmain
переменную на другой объект (как вы сделали здесь),dependent
волшебным образом ничего об этом не узнает. Теперь, если быChangeRef
не назначалOldmain
, а внутри менял свои свойства, то все работало бы так, как вы ожидаете. - person mjwills   schedule 19.02.2018