字符串变量是引用类型的,那下面的问题是怎么回事呢?

时间:2023-01-07 18:43:01
以下是一段控制台应用程序代码:

dim s1 as string="aaa"
dim s2 as string=s1
s2="bbb"
console.writeline(s1)

运行后屏幕显示为
aaa

我的理解是:
因为string是引用类型的,也就是说当将s1赋值给s2时,实际上是将它的引用赋值给了s2,那么对s2所作的任何更改将影响s1的值,也就是说s1的最后显示的值应该是"bbb"才对。有谁能告诉我是为什么吗?不胜感谢!



7 个解决方案

#1


上面的代码显示的结果很正常的啊,
s1赋值"aaa"
那s1就是"aaa"了
你又赋值s2为s1的值,也就是"aaa"
但是你最终赋值s2为"bbb"了
而你的s1从头到尾值都没有变化

#2


补充:vb.net默认是传值的

#3


--那么对s2所作的任何更改将影响s1的


没有

#4


不是指针

#5



这就是为什么 StringBuilder 比 String 效率高的原因。

就你的代码而言:

dim s1 as string="aaa"  ‘s1 指向 "aaa"所在的空间
dim s2 as string=s1      's2 与 s1 同时指向 "aaa"

 
s2="bbb"   '注意这个赋值,首先申请一个新的空间,里面放置 "bbb" ,然后s2指向这个空间。你可以看一下 s1 is s2 返回的是false,说明他们不是指向同一个空间地址。

也就是说在给string类型的变量赋值得时候,他其实不停地创建新的string 实例。

#6


string 是一个比较特殊的类型,你不能够和C里面的指针相提并论。

#7


我明白了,谢谢大家!

#1


上面的代码显示的结果很正常的啊,
s1赋值"aaa"
那s1就是"aaa"了
你又赋值s2为s1的值,也就是"aaa"
但是你最终赋值s2为"bbb"了
而你的s1从头到尾值都没有变化

#2


补充:vb.net默认是传值的

#3


--那么对s2所作的任何更改将影响s1的


没有

#4


不是指针

#5



这就是为什么 StringBuilder 比 String 效率高的原因。

就你的代码而言:

dim s1 as string="aaa"  ‘s1 指向 "aaa"所在的空间
dim s2 as string=s1      's2 与 s1 同时指向 "aaa"

 
s2="bbb"   '注意这个赋值,首先申请一个新的空间,里面放置 "bbb" ,然后s2指向这个空间。你可以看一下 s1 is s2 返回的是false,说明他们不是指向同一个空间地址。

也就是说在给string类型的变量赋值得时候,他其实不停地创建新的string 实例。

#6


string 是一个比较特殊的类型,你不能够和C里面的指针相提并论。

#7


我明白了,谢谢大家!