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