Consider the following code (for simplicity, I did not follow any C# coding rules).
public class Professor
{
    public string _Name;
    
    public Professor(){}
    public Professor(string name)
    {
        _Name=name;
    }
    public void Display()
    {
        Console.WriteLine("Name={0}",_Name);
    }
}
public class Example
{
    static int Main(string[] args)
    {
        Professor david = new Professor("David");
        Console.WriteLine("\nBefore calling the method ProfessorDetails().. ");
        david.Display();
        ProfessorDetails(david);
        Console.WriteLine("\nAfter calling the method ProfessorDetails()..");
        david. Display();
    }
    static void ProfessorDetails(Professor p)
    {
        //change in the name  here is reflected 
        p._Name="Flower";
    
        //Why  Caller unable to see this assignment 
        p=new Professor("Jon");
    }
}
As expected the output is :
Before calling the method ProfessorDetails()...
Name =David
After calling the method ProfessorDetails()...
Name =Flower
The call  p=new Professor("Jon"); in ProfessorDetails(Professor p) is not effective,  even though it is reference type. Why should i still need to use the ref keyword to get the desired result?
 
     
     
     
     
     
     
    