请过来人帮我解 惑:对象 ,值,实例 的问题

spmzfz 2009-03-28 10:19:01
字符串对象不可变,因此一旦创建就不能更改。对字符串进行操作的方法实际会返回新的字符串对象。因此,出于性能方面的考虑,大量连接或其他涉及的字符串操作应通过 StringBuilder 类来执行.

string ss = "Visual C# Express";
ss="king";

为什么说“字符串对象不可变,因此一旦创建就不能更改”? 这句话又如何理解呢?上面的代码我不是改变了它的值吗?
“对字符串进行操作的方法实际会返回新的字符串对象。” ,这句话又如何理解呢?能举个实例吗!

100分求助,先谢了。
...全文
138 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ysd_xwl 2009-03-28
  • 打赏
  • 举报
回复
学习!
cnfcnf 2009-03-28
  • 打赏
  • 举报
回复
string ss = "Visual C# Express";
ss="king";


string对象在第二次赋值的时候,其实是创建另一个string对象。
而并不是修改前一个string对象的值。
第一个string对象会等待无用存储单元释放自己所占内存资源。
a260881071 2009-03-28
  • 打赏
  • 举报
回复
我以前也有过这样的疑问到现在还没解决呢,不过看上面的回答,我还是不明白
kingtiy 2009-03-28
  • 打赏
  • 举报
回复

string ss = "Visual C# Express";
ss="king";
string 是.net特殊的引用类型。上面的操作,只有一个对象被创建,只是把对像的引用指向改变了下
string ss = "Visual C# Express";
ss+="king"; //这样会创建一个新的对象。
jiyan1221 2009-03-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 spmzfz 的帖子:]
字符串对象不可变,因此一旦创建就不能更改。对字符串进行操作的方法实际会返回新的字符串对象。因此,出于性能方面的考虑,大量连接或其他涉及的字符串操作应通过 StringBuilder 类来执行.

string ss = "Visual C# Express";
ss="king";

为什么说“字符串对象不可变,因此一旦创建就不能更改”? 这句话又如何理解呢?上面的代码我不是改变了它的值吗?
“对字符串进行操作的方法实际会返回新的字符串对象。” ,这…
[/Quote]
最开始,ss指向Visual C# Express,随后修改之后,原来那个对象还存在于内存之中,只是ss这个引用变量不再指向它了,String的操作都是改变赋值地址而不是改变值操作。所以说string对象不可变,效率比较低。
PandaIT 2009-03-28
  • 打赏
  • 举报
回复
string a = "csdn";
string b = "zhoukang";
a += b;
Console.WriteLine(a);
Console.WriteLine(b);
//打印结果:csdnzhoukang zhoukang

这时候a会生成一个新的字符串

你在下面调用的时候用的都是a=csdnzhoukang

你前面生成的被覆盖
aa37742698 2009-03-28
  • 打赏
  • 举报
回复
你应该给设置成常量了吧
zzxap 2009-03-28
  • 打赏
  • 举报
回复
前面赋的值会被覆盖
oyljerry 2009-03-28
  • 打赏
  • 举报
回复
4. String为什么是Immutable,怎么实现的?
immutable:对象一旦生成不可改变
关于怎么实现的,在明白了问题2之后很好办,只要不提供任何修改自己成员变量的方法就可以了。顺便声明为sealed,防止不清楚的后来者违反规定:)
String每个看似修改了成员变量的方法,事实上都返回了一个新的String。
比如String.Replace函数,事实上并没有改变原来的串,这也是为什么只有让str = str.Replace( foo, bar )才真正完成替换的原因。

关于为什么是immutable,参见:
Why are strings immutable? (http://blog.joycode.com/qqchen/archive/2004/08/21/31216.aspx)
zzxap 2009-03-28
  • 打赏
  • 举报
回复
可以这样的啊
string ss = "Visual C# Express";
ss="king";
spmzfz 2009-03-28
  • 打赏
  • 举报
回复
好啊,谢谢各位的解答,不知道还有没有更通俗的解析呢,我会给分的。
万婷 2009-03-28
  • 打赏
  • 举报
回复
string ss = "Visual C# Express";
ss="king";

更改String类型变量时,看上去好象是修改他的值,事实上是返回了一个新的String对象

比如一开始ss="Visual c# Express" 的地址为 #ASD
更改为ss="king"后 他的地址变成 #QWE

前面的地址中还存在值 没有销毁,所以你每次给String 附值 都会新指定一个新的内存地址
效率低 还占地方
内存地址换了 就是一个新对象
stonehy520 2009-03-28
  • 打赏
  • 举报
回复
引用类型和值类型的区别
zgke 2009-03-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wuyq11 的回复:]
一个字符串一旦被创建完成后,将不能再做任何改变,比如改变、增加或减少一个字符。
当把一个字符串变量赋给另一个字符串变量时,会得到内存中同一个字符串的两个引用,但与引用类型在常见的操作上又有区别。当修改其中一个字符串的时候,
会创建一个全新的String对象,其引用的原字符串并不会改变,因而另一个字符串变量的值不变。
当我们创建了字符串对象a,它的值是“1234”,当再创建一个值为“1234”的字符串对象b时它…
[/Quote]

string ss = "Visual C# Express";
ss="king";

是两个字符对象..
"Visual C# Express";
"king";

当ss="King";时候 SS是对King的引用。


wuyq11 2009-03-28
  • 打赏
  • 举报
回复
一个字符串一旦被创建完成后,将不能再做任何改变,比如改变、增加或减少一个字符。
当把一个字符串变量赋给另一个字符串变量时,会得到内存中同一个字符串的两个引用,但与引用类型在常见的操作上又有区别。当修改其中一个字符串的时候,
会创建一个全新的String对象,其引用的原字符串并不会改变,因而另一个字符串变量的值不变。
当我们创建了字符串对象a,它的值是“1234”,当再创建一个值为“1234”的字符串对象b时它不会再去分配一块内存空间,而是直接指向了a在内存中的地址。
http://terrylee.cnblogs.com/archive/2005/12/26/304876.aspx

110,578

社区成员

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

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

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