gpt4 book ai didi

c# - 通过引用传递引用

转载 作者:行者123 更新时间:2023-12-02 14:38:20 26 4
gpt4 key购买 nike

通过引用传递引用对象有什么用处。常规用法如下:

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

最佳答案

它不会做同样的事情......在幕后。

从功能上来说,它的工作原理是一样的,是的。但在幕后......使用 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 时,您使被调用者能够物理更改引用本身......而不仅仅是它指向的内存。

关于c# - 通过引用传递引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18649089/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com