如果字符串是引用类型,为什么不按引用传递

本文关键字:为什么不 按引用传递 引用类型 字符串 如果 | 更新日期: 2023-09-27 18:14:32

我读过一篇文章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,它也会改变我已经在外面声明的原始值吗?

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