2013-09-06 6 views
2

Как было бы полезно передать ссылочный объект по ссылке. Регулярное использование как в следующем:Передача справки по ссылке

public static void main() 
{ 
    Student st = new Student(); 
    st.FirstName = "Marc"; 
    PutLastName(st); 
    Console.WriteLLine(st.FirstName + " " + st.LastName); 
} 

public static PutLastName(Student student) 
{ 
    student.LastName = "Anthony"; 
} 

Почему бы кто-нибудь написать следующее, который делает то же самое и делает печать: «Марк Энтони»:

public static void main() 
{ 
    Student st = new Student(); 
    st.FirstName = "Marc"; 
    PutLastName(ref st); 
    Console.WriteLLine(st.FirstName + " " + st.LastName); 
} 

public static PutLastName(ref Student student) 
{ 
    student.LastName = "Anthony"; 
} 
+0

Это, в основном, обман: http://stackoverflow.com/questions/635915/when-to-use-ref-and-when-it-is-not-necessary-in-c-sharp. Вы должны просто прочитать документацию для 'ref', чтобы понять разницу: http://msdn.microsoft.com/en-us/library/14akc2c7.aspx. Конечно, я не думаю, что есть общие причины для использования 'ref', поэтому ваш мозг может с трудом принять такое существо. – rliu

ответ

6

Это не делает то же самое предмет .. внизу капот.

Функционально, он работает так же, да. Под капотом, хотя .. сама ссылка передается при использовании 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 вы даете вызываемой способности физически изменять саму ссылку ... не только память, на которую она указывает.

+0

Я отлично понял разницу, и вы попали в сердце истины, когда сказали, что использование ref может быть опасным. Благодаря, – yazanpro

0

Во второй версии ref означает, что PutLastName может изменить st.

0

Передача ссылки по ссылке позволяет не только редактировать ссылочные данные, но также позволяет изменять объект, который он ссылается на себя.

Разница в этих целях:

// from the Main's point of view, this function does absolutely nothing 
public static PutLastName(Student student) 
{ 
    student = new Student(); 
} 

// This would clear Main's student. 
public static PutLastName(ref Student student) 
{ 
    student = new Student(); 
} 

см http://msdn.microsoft.com/en-us/library/14akc2c7.aspx

0

В основном, проходя по ссылке (ref или out) делает то же самое, независимо от типа (ссылочного типа или других типов) - он позволяет присваивать параметру в функции тот же эффект, что и присвоение исходной переданной переменной в области вызова. Этого никогда не случится, если вы не пройдете по ссылке.

Смежные вопросы