通过引用传递引用对象有什么用呢?正常使用情况如下:
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";
}发布于 2013-09-06 02:53:32
它不做同样的事..。在引擎盖下面。
在功能上,它的工作原理是一样的。但是在引擎盖下面..。当使用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-06 02:54:49
在第二个版本中,ref意味着PutLastName可以更改st。
发布于 2013-09-06 02:56:17
通过引用传递引用,不仅可以编辑引用的数据,而且还允许您更改它引用的对象本身。
不同之处在于这些用途:
// 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
https://stackoverflow.com/questions/18649089
复制相似问题