gpt4 book ai didi

c# - 按值传递和按引用传递

转载 作者:太空狗 更新时间:2023-10-29 22:03:28 25 4
gpt4 key购买 nike

您能否解释一下 C# 类的以下行为。我希望 classResult 为“Class Lijo”;但实际值是“已更改”。

我们正在制作引用资料的副本。虽然副本指向相同的地址,但接收参数的方法不能更改原始地址。

为什么值会改变?

public partial class _Default : Page 
{
protected void Page_Load(object sender, EventArgs e)
{
String nameString = "string Lijo";

Person p = new Person();
p.Name = "Class Lijo";

Utilityclass.TestMethod(nameString, p);
string classResult = p.Name;
Response.Write(nameString + "....." + classResult);
}
}

public class Utilityclass
{
public static void TestMethod(String nameString, Person k)
{
nameString = "Changed";
k.Name = "Changed";
}
}

public class Person
{
public string Name
{
get; set;
}
}

更新:当我传递一个字符串时,它实际上并没有改变。

最佳答案

最简短的答案是:阅读 my article on parameter passing其中有相当多的细节。

稍微长一点的答案是比较这两种方法,这两种方法都使用value参数:

public void ChangeMe(string x)
{
x = "changed";
}

public void ChangeMe(Person x)
{
x.Name = "changed";
}

在第一种情况下,您正在更改参数的。这完全脱离了最初的论点。您无法更改字符串本身的内容,因为字符串是不可变的。

在第二种情况下,您正在更改参数值引用的对象的内容。这并没有改变参数本身的值——它将是相同的引用。举一个现实世界的例子,如果有人把东西送到你家,改变了你家的内容,但它并没有改变你家的地址。

如果您将第二种方法更改为:

public void ChangeMe(Person x)
{
x = new Person("Fred");
}

那么调用者将看不到任何变化。这更接近于您对字符串所做的操作 - 您正在使参数引用不同的对象,而不是更改现有对象的内容。

现在,当您使用 ref 参数时,调用者用作参数的变量与参数“别名” - 因此,如果您更改参数的值,则会更改该值的论点也是如此。因此,如果我们像这样更改最后一个方法:

public void ChangeMe(ref Person x)
{
x = new Person("Fred");
}

然后:

Person y = new Person("Eric");
ChangeMe(ref y);
Console.WriteLine(y.Name);

这将打印出“Fred”。

要理解的关键概念是,变量的值绝不是对象 - 它要么是值类型值,要么是引用。如果对象的数据发生更改,则该更改将通过其他引用可见。一旦您了解复制引用与复制对象不同,剩下的就很容易搞定了。

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

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