Не во всех случаях работает передача объекта в метод по ссылке - C#
Формулировка задачи:
Всем нам известно, что классы - это ссылочный тип данных и передавая экземпляр класса в метод, он передается по ссылке. Если метод внесет какие-то изменения в этот экземпляр, то по выходу из метода, изменения сохранятся.
Но, как оказалось, почему-то это не всегда это так!
Ниже я привел простенький пример, поведение которого мне не понятно итребуется ваша помощь
!using System; namespace ConsoleApplication1 { class Program { public class ClassA { public ClassA(int value) { SomeVar = value; } public int SomeVar { get; set; } } public class ClassB { public void DoSomethingWithClassA(ClassA obj) { obj.SomeVar++; } public void DoNotWorkMethod(ClassA obj) { var newObj = new ClassA(500); obj = newObj; } public void DoNotWorkMethod2(ClassA obj) { obj = someObj; } } public static ClassA someObj = new ClassA(1000); static void Main(string[] args) { var objClassA = new ClassA(100); Console.WriteLine("Before: {0}", objClassA.SomeVar); var objClassB = new ClassB(); objClassB.DoSomethingWithClassA(objClassA); Console.WriteLine("After DoSomethingWithClassA(...): {0}", objClassA.SomeVar); //Before: 100 //After DoSomethingWithClassA(...): 101 //Тут все здорово и передача по ссылке работает objClassB.DoNotWorkMethod(objClassA); Console.WriteLine("After DoNotWorkMethod(...): {0}", objClassA.SomeVar); //Ожидаю, что значение переменной станет 500, но выводит: //After DoNotWorkMethod(...): 101 //Может кто-то объяснить ПОЧЕМУ значение не изменилось??? //Я сначала подумал, что переменная объявлена внутри метода и по выходу //из него ее время жизни закончено и сборщик мусора ее удалил. //Чтобы проверить это предположение добавил переменную, которая точно будет существовать. objClassB.DoNotWorkMethod2(objClassA); Console.WriteLine("After DoNotWorkMethod2(...): {0}", objClassA.SomeVar); //Ожидаю, что уж тут-то точно изменится значение на 1000, но нет! Выводит это: //After DoNotWorkMethod2(...): 101 } } }
Может кто-то объяснить что не так?
Нужно именно объяснение: внятное и доходчивое! По какой причине во втором и третьем методе значение не изменилось? Я искренне не понимаю. Ячейка стека, которая содержит ссылку на объектobjClassA
в куче и по выходу содержит ссылку на этот объект. Но ведь объект внутри метода подменен. Почему же не сработало?Решение задачи: «Не во всех случаях работает передача объекта в метод по ссылке»
textual
Листинг программы
class Box<T> { public T Value { get; set; } public Box(T value) { this.Value = value; } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д