Не во всех случаях работает передача объекта в метод по ссылке - 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;
   }
}

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


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

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

9   голосов , оценка 3.889 из 5
Похожие ответы