首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过引用传递引用

通过引用传递引用
EN

Stack Overflow用户
提问于 2013-09-06 02:49:18
回答 3查看 196关注 0票数 2

通过引用传递引用对象有什么用呢?正常使用情况如下:

代码语言:javascript
复制
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";
}

为什么有人会写下列文字,做同样的事情并打印出来:“马克·安东尼”:

代码语言:javascript
复制
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";
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-06 02:53:32

它不做同样的事..。在引擎盖下面。

在功能上,它的工作原理是一样的。但是在引擎盖下面..。当使用ref时,引用本身将被传递。如果没有ref,则复制引用值。

将引用视为内存指针。student的值为1134。一个记忆地址。如果不使用ref,则将1134应用于新的引用。指向同一个内存地址。

当您意识到上述情况时,使用ref可能会产生危险的后果。例如,考虑以下几点:

代码语言:javascript
复制
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

代码语言:javascript
复制
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时,您将赋予被调用方物理更改引用本身的能力。不仅仅是它所指向的记忆。

票数 6
EN

Stack Overflow用户

发布于 2013-09-06 02:54:49

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

票数 0
EN

Stack Overflow用户

发布于 2013-09-06 02:56:17

通过引用传递引用,不仅可以编辑引用的数据,而且还允许您更改它引用的对象本身。

不同之处在于这些用途:

代码语言:javascript
复制
// 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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18649089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档