Давайте сразу начнем с кода. У нас есть вот такой код, давайте разберемся почему он выводит то, что выводит:
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) типы. Первые - размещаются полностью в стеке, а вторые размещаются в управляемой куче, а в стеке размещается только указатель на них.



















