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";
}

为什么有人会写以下内容,它做同样的事情并打印:“Marc 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";
}
4

4 回答 4

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,您使被调用者能够物理地更改引用本身.. 而不仅仅是它指向的内存。

于 2013-09-06T02:53:32.080 回答
0

在第二个版本中, ref 意味着 PutLastName 可以更改 st。

于 2013-09-06T02:54:49.957 回答
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

于 2013-09-06T02:56:17.963 回答
0

基本上,无论类型(引用类型或其他类型)如何,通过引用(refout)传递都会做同样的事情——它允许对函数中的参数赋值与在调用中对原始传递变量的赋值具有相同的效果范围。当不通过引用传递时,这永远不会发生。

于 2013-09-06T09:33:47.830 回答