Это не то же самое .. под капотом.
Функционально он работает одинаково, да. Однако под капотом... сама ссылка передается при использовании ref
. Без ref
опорное значение копируется.
Думайте о ссылках как об указателях памяти. student
имеет значение 1134
.. адрес памяти. Когда вы не используете ref
, 1134
применяется к новой ссылке... указывающей на тот же адрес памяти.
Использование ref
может иметь опасные последствия, когда вы осознаете вышеизложенное. Например, рассмотрите это:
public static void PutLastName(Student student)
{
student = new Student();
student.LastName = "Whitehead";
}
// .. calling code ..
Student st = new Student();
st.FirstName = "Marc";
st.LastName = "Anthony";
PutLastName(st);
Console.WriteLLine(st.FirstName + " " + st.LastName); // "Marc Anthony"
Принимая во внимание, что использование ref
:
public static void PutLastName(ref Student student)
{
student = new Student();
student.FirstName = "Simon";
student.LastName = "Whitehead";
}
// .. calling code ..
Student st = new Student();
st.FirstName = "Marc";
st.LastName = "Anthony";
PutLastName(ref st);
Console.WriteLLine(st.FirstName + " " + st.LastName); // "Simon Whitehead"
Использование ref
физически изменило ссылку. Без этого ... вы просто указываете другую ссылку, чтобы указать где-то еще (что недействительно, как только функция выходит). Таким образом, при использовании ref
вы даете вызываемому объекту возможность физически изменить саму ссылку, а не только память, на которую она указывает.
person
Simon Whitehead
schedule
06.09.2013
ref
, чтобы понять разницу: msdn.microsoft. com/en-us/library/14akc2c7.aspx. Конечно, я не думаю, что есть общие причины для использованияref
, поэтому вашему мозгу может быть трудно принять существование такой вещи. - person rliu   schedule 06.09.2013