Не во всех случаях работает передача объекта в метод по ссылке - 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;
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д