Давайте сразу начнем с кода. У нас есть вот такой код, давайте разберемся почему он выводит то, что выводит:
class Program { static void Main(string[] args) { int a = 1; ProcessValue(a); Console.WriteLine(a.ToString()); //здесь будет выведено 1 TestClass test = new TestClass(); test.val = 2; ProcessRef(test); Console.WriteLine(test.val.ToString()); //здесь будет выведено 10 TestClass test = new TestClass(); test.val = 3; Process(test); Console.WriteLine(test.val.ToString()); //а здесь будет выведено 3 } static void ProcessValue(int par) { par = 3; } static void ProcessRef(TestClass par) { par.val = 10; } static void Process(TestClass par) { par = new TestClass(); par.val = 100; } } public class TestClass { public int val; }
Вы, наверняка, знаете, что в .Net есть значимые (value) и ссылочные (reference) типы. Первые - размещаются полностью в стеке, а вторые размещаются в управляемой куче, а в стеке размещается только указатель на них.