Не совсем, нет.К тому времени, когда ваш код будет вызван в следующий раз, исходная переменная, используемая в качестве аргумента метода, может уже не существовать:
void Foo()
{
MyClass x = Bar();
x.ModifyApple();
}
MyClass Bar()
{
Apple apple = new Apple();
return new MyClass(ref apple);
}
Здесь apple
- это локальная переменная вкадр стека, который будет вытеснен к тому времени, когда мы вызовем ModifyApple
.
Вы уверены, что вам нужно изменить переменную исходного вызывающего , а не просто изменить сам объект?
Один из способов сортировки фальшивок: использовать для начала тип обертки:
public class MutableWrapper<T>
{
public T Value { get; set; }
}
Затем передать MutableWrapper<Apple>
и сохранить его в своем классе.,Затем в ModifyApple
вы можете написать:
wrapper.Value = new Apple();
Это не изменит переменную вызывающего абонента , но в следующий раз, когда вызывающий объект смотрит на свойство Value
, он увидитваше новое яблоко.
Если честно, такого рода вещи имеют тенденцию создавать трудно поддерживаемый код, и даже ref
не очень хорош для читабельности.Если вы сможете объяснить более полную картину того, чего вы пытаетесь достичь, мы можем предложить лучший общий подход.