如果string是引用类型,为什么不通过引用传递?

时间:2015-09-25 23:42:36

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

我读过一篇文章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,它是否也会更改我已在外部声明的原始值?

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

1 个答案:

答案 0 :(得分:4)

  

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

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

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)
{
    ...
}