string类型的一个问题

ralpha08 2006-10-23 02:26:28
private void Form1_Load(object sender, EventArgs e)
{

X x1 = new X();
x1.str = "123456";

Change(x1);

MessageBox.Show(x1.str);
string str = "123456";
Change(str);
MessageBox.Show(str);
}

public void Change(X x1)
{
x1.str = "123";
}

public void Change(string str)
{
str = "123";
}

显示
123456
123

为什么会这样string类型不是引用类型吗 ?
我传类和传string应该都是引用类型的地址,都应该可以直接修改类型的值
为什么传string和类X结果会不一样?
...全文
106 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
亮灯了 2006-10-23
  • 打赏
  • 举报
回复
对于aafshzj (30)的解释,上面那个自定义的类X的一个实例中的字符串被修改,又做何解释呢?
aafshzj 2006-10-23
  • 打赏
  • 举报
回复
呵呵,发晕了,大家都有点误导哦。我仔细看了一下,根本没有问题!

虽然分都已经给了,但是本着实事求是的精神,还是要把道理讲出来:
1)string 是immutable,但是此例和string的immutable属性无关,你换一种其他引用类型也仍然会如此。因为参数默认传递的是参数值。如果把引用的值看作一个指针的话,参数只是把这个引用的值(指针)传进去,你在函数里只是把此刻存放这个值(指针)的局部变量的值改了。也就是说局部变量确实被重定向到其它一个对象,但你并没有一种渠道通知CLR把这种更新体现到函数体之外的引用变量本身。函数外的引用变量本身还是保存着原有指针。所以如果要在函数里将某个外部对象引用到其它新对象,都应该用ref方式。

因此,这个“问题”是所有引用类型都会有的正常表现,不属于string的特殊状况。

aafshzj 2006-10-23
  • 打赏
  • 举报
回复
不过,说值拷贝并不准确。其实在.net里有一个概念叫mutable/immutable。 string属于immutable的,也就是不可改变的。一个值对应一个引用,值改变引用也改变。而不可能对同一个引用改变其值。因此你上面的str = "123";实际上就改变了str本身的引用。而因为你将str作为一个引用通过参数值传进来的,引用自身的改变无法再传回去。如果你希望能将引用自身的改变传回去,那么在传递引用进来时,就应该加ref 前缀。

viena 2006-10-23
  • 打赏
  • 举报
回复
//关键是我觉得传值得时候引用类型传得是地址 返回这样的结果就很难理解
我觉得很好理解啊,因为他就是这样设计的
毕竟需要传引用的可能性要远远小于传值
viena 2006-10-23
  • 打赏
  • 举报
回复
如果你要穿引用,要在定义与调用参数前加ref
aafshzj 2006-10-23
  • 打赏
  • 举报
回复
string确实是引用类型,但是作为参数传递时是基于值拷贝的。
ralpha08 2006-10-23
  • 打赏
  • 举报
回复
判断==值相等这个比较好理解 重写==操作符就可以
关键是我觉得传值得时候引用类型传得是地址 返回这样的结果就很难理解
ralpha08 2006-10-23
  • 打赏
  • 举报
回复
是比较特殊 感觉string的特性介于值类型和引用类型之间
viena 2006-10-23
  • 打赏
  • 举报
回复
string是特殊的引用类型
比如用==判断string的相等也是判断值是否相等
ralpha08 2006-10-23
  • 打赏
  • 举报
回复
错了
结果是

123
123456

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧