首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果字符串是引用类型,为什么不进行引用传递?

如果字符串是引用类型,为什么不进行引用传递?
EN

Stack Overflow用户
提问于 2015-09-26 07:42:36
回答 1查看 218关注 0票数 0

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

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

代码语言:javascript
复制
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

另外,如果值将保存在堆栈中,并且只将引用存储在堆中,那么保留字符串作为引用类型的好处是什么?

EN

回答 1

Stack Overflow用户

发布于 2015-09-26 07:53:53

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

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

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

代码语言:javascript
复制
f.Text = "Hello, World!";

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

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

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

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

代码语言:javascript
复制
void Test (Point p, ref Form f)
{
    ...
}

void Test (Point p, ref string s)
{
    ...
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32792100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档