С ref можно сделать так
using System;
public class SomeObj
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Program
{
public static void Main(string[] args)
{
SomeObj someObj=new SomeObj() { Id=2, Name="SomeName2" };;
if (CreateObj(ref someObj))
{
Console.Write("{0} {1}", someObj.Id, someObj.Name);
}
}
public static bool CreateObj(ref SomeObj obj)
{
obj = new SomeObj() { Id=1, Name="SomeName" };
return true;
}
}
В консоли будет 1 SomeName, а без ref будет другой результат, c ref значимые типы по ссылке передаются, а для ссылочных типов передается ссылка на ссылку ( ибо ссылка передается по значению), которую мы можем поменять, можем в методе создать новый объект и присвоить его аргументу, без ref мы присвоим ссылку копии которая лежит в стеке, при передаче аргумента. есть еще и ключевое слово out, от ref отличается тем, что переменная не обязательно должна быть инициализирована.