Не во всех случаях работает передача объекта в метод по ссылке - C#

Узнай цену своей работы

Формулировка задачи:

Всем нам известно, что классы - это ссылочный тип данных и передавая экземпляр класса в метод, он передается по ссылке. Если метод внесет какие-то изменения в этот экземпляр, то по выходу из метода, изменения сохранятся.

Но, как оказалось, почему-то это не всегда это так!

Ниже я привел простенький пример, поведение которого мне не понятно и

требуется ваша помощь

!
Листинг программы
  1. using System;
  2. namespace ConsoleApplication1
  3. {
  4. class Program
  5. {
  6. public class ClassA
  7. {
  8. public ClassA(int value) { SomeVar = value; }
  9. public int SomeVar { get; set; }
  10. }
  11. public class ClassB
  12. {
  13. public void DoSomethingWithClassA(ClassA obj) { obj.SomeVar++; }
  14. public void DoNotWorkMethod(ClassA obj)
  15. {
  16. var newObj = new ClassA(500);
  17. obj = newObj;
  18. }
  19. public void DoNotWorkMethod2(ClassA obj) { obj = someObj; }
  20. }
  21. public static ClassA someObj = new ClassA(1000);
  22. static void Main(string[] args)
  23. {
  24. var objClassA = new ClassA(100);
  25. Console.WriteLine("Before: {0}", objClassA.SomeVar);
  26. var objClassB = new ClassB();
  27. objClassB.DoSomethingWithClassA(objClassA);
  28. Console.WriteLine("After DoSomethingWithClassA(...): {0}", objClassA.SomeVar);
  29. //Before: 100
  30. //After DoSomethingWithClassA(...): 101
  31. //Тут все здорово и передача по ссылке работает
  32. objClassB.DoNotWorkMethod(objClassA);
  33. Console.WriteLine("After DoNotWorkMethod(...): {0}", objClassA.SomeVar);
  34. //Ожидаю, что значение переменной станет 500, но выводит:
  35. //After DoNotWorkMethod(...): 101
  36. //Может кто-то объяснить ПОЧЕМУ значение не изменилось???
  37. //Я сначала подумал, что переменная объявлена внутри метода и по выходу
  38. //из него ее время жизни закончено и сборщик мусора ее удалил.
  39. //Чтобы проверить это предположение добавил переменную, которая точно будет существовать.
  40. objClassB.DoNotWorkMethod2(objClassA);
  41. Console.WriteLine("After DoNotWorkMethod2(...): {0}", objClassA.SomeVar);
  42. //Ожидаю, что уж тут-то точно изменится значение на 1000, но нет! Выводит это:
  43. //After DoNotWorkMethod2(...): 101
  44. }
  45. }
  46. }

Может кто-то объяснить что не так?

Нужно именно объяснение: внятное и доходчивое! По какой причине во втором и третьем методе значение не изменилось? Я искренне не понимаю. Ячейка стека, которая содержит ссылку на объект

objClassA

в куче и по выходу содержит ссылку на этот объект. Но ведь объект внутри метода подменен. Почему же не сработало?

Решение задачи: «Не во всех случаях работает передача объекта в метод по ссылке»

textual
Листинг программы
  1. class Box<T>
  2. {
  3.    public T Value { get; set; }
  4.  
  5.    public Box(T value)
  6.    {
  7.      this.Value = value;
  8.    }
  9. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.889 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы