using System;

public class A
{
    public int i;

    public A(int i)
    {
        this.i = i;
    }
}

public class MainClass
{
    public static void Main()
    {
        A a = new A(1);

        Test(a);
        //Test(ref a);

        Console.WriteLine(a.i.ToString());
    }

    private static void Test(A a)
    {
        a = new A(2);
        //a.i = 2;
    }
}

/*

주소:변수명    값   할당
001 : a  -> H001
002 : a  -> H001 <- H002

Test(a)
Test(A a)
a = new A(2)
--------------
1

 

주소:변수명  값  할당
001 : a  -> H001 <- H002
   ↑
002 : *a  -> *001

Test(ref a)
Test(ref A a)
a = new A(2)
--------------
2

 

주소:변수명  값  할당
001 : a  -> H001
002 : a  -> H001.i <- 2


Test(a)
Test(A a)
a.i = 2
--------------
2


* ref는 일반적으로 value타입을 참조 형태로 쓰기 위함이다.
value타입을 전달하지 않고 객체(reference type)를 전달하여 객체내부 맴버를 변경하는 동작을 한다면....
ref로 전달하든 안하든 외형적인 차이는 없다.

*/