Вы можете думать об этом так:
Когда вы присваиваете свое свойство локальной переменной,
var rightFooToModify = myclassInstance.Foo1;
все, что вы делаете - это пишите заметку с указанием местоположениянемного памяти на.
Если кто-то дает вам еще одну заметку с некоторыми дополнительными примечаниями, заменяя исходную
rightFooToModify = new Foo();
Она не меняет исходную память, она все еще там, ничего не произошло.
Так работают указатели / ссылки.Они указывают / ссылаются на местоположение в памяти, вы можете скопировать ссылку, но при этом перезаписать, что ссылка ничего не делает с исходной памятью, у вас просто есть новая запись, указывающая куда-то еще.
Однако, теперь для действительно надуманного примера способа преодолеть это с ref return
и ref Local
Отказ от ответственности, я действительно не рекомендую делать это в вашей ситуации, однако для чисто академических целей давайте рассмотрим эту языковую особенность
Учитывая
public class MyClass
{
private Foo _foo1;
public Foo Foo1
{
get => _foo1;
set => _foo1 = value;
}
public ref Foo ModifyMyClass()
{
return ref _foo1;
}
}
Пример
// create class
var someClass = new MyClass();
// create some memory for it
someClass.Foo1 = new Foo();
someClass.Foo1.SomeValue = "test";
// copy the reference to it
var copy = someClass.Foo1;
// overwrite it
copy = new Foo();
copy.SomeValue = "test2";
// oh nossssssssss!!!! is didn't change!!
Console.WriteLine(someClass.Foo1.SomeValue);
//enter ref local
ref var actualLocation = ref someClass.ModifyMyClass();
// create some memory
actualLocation = new Foo();
actualLocation.SomeValue = "test3";
// omg it worked!!!!
Console.WriteLine(someClass.Foo1.SomeValue);
Вывод
test
test3
И еще одно странное и странное использование ref
someClass.ModifyMyClass() = new Foo();
someClass.ModifyMyClass().SomeValue = "I hope i never see this in my code base";
Console.WriteLine(someClass.Foo1.SomeValue);