static void Main(string[] args)
{
    var people = new Student("Phạm Quốc Thắng", "Developer", 19);
    change(people);
    Console.Write(people.Title); // MSP

    change2(ref people);
    Console.Write(people.Title); // MSP
    Console.ReadLine();
}
static void change(Student s)
{
    s.Title = "MSP";
}

static void change2(ref Student s)
{
    s.Title = "MSP";
}

Với case đầu tiên (dùng method change(Student s))


Vì people là một biến với kiểu dữ liệu có tham chiếu. Nên việc truyền vào method change và bị thay đổi là điều hiển nhiên.


Với case thứ hai (dùng method change2)


Cũng hiển nhiên đúng vì đã thêm từ khóa ref vào để hiểu rằng mình đang truyền kiểu tham chiếu.


Thế tại sao lại Student đã là Reference Type mà còn thêm ref?


Bạn cần phải luôn nhớ là trong C#, pass-reference-by-value là mặc định. Nó có nghĩa là khi bạn truyền 1 tham chiếu vào 1 method trong C# thì C# sẽ tạo ra 1 bản copy của tham chiếu đó, rồi thay đổi cái bản copy. Sau khi kết thúc Method thì nó sẽ gán tham chiếu ban đầu bằng cái copy và cái ban đầu sẽ bị lãng quên.


Vậy nếu thêm ref vào?


Khi bạn thêm ref vào, khi đó C# sẽ hiểu là bạn cần bỏ qua việc copy 1 cái tham chiếu đó. Khi đó reference parameter và original parameter đều cùng trỏ đến 1 cái original parameter ban đầu.


Tham khảo: MSDN Microsoft | Code Project