gpt4 book ai didi

C# 默认传递参数是 ByRef 而不是 ByVal

转载 作者:IT王子 更新时间:2023-10-29 04:36:11 24 4
gpt4 key购买 nike

我知道 C# 中的默认值是 ByVal。我在很多地方使用了相同的变量名,然后我注意到传递的值发生变化并返回。我想我知道 C# 的作用域机制是错误的。这里公共(public) license 覆盖本地 license 值。我知道我可以轻松重命名冲突的变量名称,但我想了解有关范围的事实。

  public static class LicenseWorks
{
public static void InsertLicense(License license)
{
license.registered = true;
UpdateLicense(license);
}
}

public partial class formMain : Form
{
License license;

private void btnPay_Click(object sender, EventArgs e)
{
license.registered = false;
LicenseWorks.InsertLicense(license);

bool registered = license.registered; //Returns true!
}
}

更新:我在下面添加了解决方案:

    public static void InsertLicense(License license)
{

license = license.Clone();
...
}

最佳答案

参数是按值传递的 - 但参数不是对象,而是引用。该引用 正在按值传递,但通过该引用对对象 所做的任何更改仍将被调用者看到。

这与真正的通过引用传递非常不同,后者对参数本身的更改如下:

 public static void InsertLicense(ref License license)
{
// Change to the parameter itself, not the object it refers to!
license = null;
}

现在,如果您调用 InsertLicense(ref foo),它会使 foo 之后变为 null。没有 ref,它就不会。

有关更多信息,请参阅我写的两篇文章:

关于C# 默认传递参数是 ByRef 而不是 ByVal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9717057/

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