【问题标题】:If string is reference type, why pass by reference is not happening?如果字符串是引用类型,为什么不通过引用传递?
【发布时间】:2015-09-25 23:42:36
【问题描述】:

我看过一篇文章http://www.albahari.com/valuevsreftypes.aspx

据此,int 是值类型,form 是引用类型的示例。

Point myPoint = new Point (0, 0);      // a new value-type variable
Form myForm = new Form();              // a new reference-type variable
string mystringval="test";
Test (myPoint, myForm);                // Test is a method defined below

void Test (Point p, Form f)
{
      p.X = 100;                       // No effect on MyPoint since p is a copy
      f.Text = "Hello, World!";        // This will change myForm’s caption since
                                       // myForm and f point to the same object
      f = null;                        // No effect on myForm
}

所以不是表单变量myform,如果我将一个字符串值传递给函数test,它是否也会改变我已经在外面声明的原始值?

另外,将字符串保留为引用类型有什么好处,如果无论如何将值保存在堆栈中,并且只有引用将存储在堆中?

【问题讨论】:

  • @GrantWinney,如果字符串是不可变的,为什么不使用提供的最后一个值进行更新?我为什么要给 ref 一个引用类型?

标签: c# asp.net vb.net pass-by-reference value-type


【解决方案1】:

如果我将一个字符串值传递给函数测试,它是否也会改变我已经在外面声明的原始值?

不,myForm 的值也没有改变,myForm 变量仍然指向/引用相同的Form 对象(通过new Form() 创建的对象)。

在您的Test 方法中,当您调用时:

f.Text = "Hello, World!";

您没有更改变量f,您更改了f.Text,这是一个不同的变量。

换句话说,您正在更改fmyForm 都引用的对象的属性。但fmyForm 仍然指向同一个原始对象。

请注意,当您将f 更改为null 时,变量myForm 没有更改。现在,f 没有引用任何内容,但 myForm 变量仍然引用原始对象。

如果您想更改原始的 myForm 变量(使其指向/引用另一个 Form 对象)或 mystringval(使其引用另一个字符串),然后通过引用将它们传递给测试方法,如下所示:

void Test (Point p, ref Form f)
{
    ...
}

void Test (Point p, ref string s)
{
    ...
}

【讨论】:

  • 谢谢你..我明白你的意思。因此字符串被归类为引用类型,因为它可能包含堆栈无法处理的大量数据。我说的对吗?
  • 如果是这样,string的值会存入堆吗?将字符串保存在堆中有什么好处?
  • 我相信这不是选择的问题。由于字符串大小的性质,它需要在堆中。毕竟在 c 中,字符串只是一个指向内存的指针,其中结尾用 /0 标记。这里可能是错的,因为我对 c# 比较陌生。
  • @user833985 - 我认为您对堆栈和堆有一些误解。您应该忽略区别,因为对象的行为与它们的位置无关存储。您应该关注的是这两个概念 - “值与引用类型”和“可变与不可变类型”。
  • 正确。堆与堆栈是实现细节。 CLR 当然不使用对象的大小作为对象存储位置的决定因素。即使这样做了,也需要确保对象的行为在它们超过大小阈值并最终存储在不同的数据结构中时不会改变。这将导致严重的非确定性程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-11
  • 2017-07-25
  • 2016-07-05
  • 2015-12-29
  • 2018-09-01
  • 2013-04-07
  • 2015-03-24
相关资源
最近更新 更多