同意楼上的,String对象是不可改变的:一旦创建了一个字符串,则不能再更改它的内容。实际上,所有的方法都不能更改原始字符串,而是返回另一个String对象,可将该对象赋给同一个String对象。如果进行这种赋值,将无法从应用程序对原始的String对象进行访问(除非有其他变量指向它),且最终该对象将变成垃圾而被回收。.NET应用程序通过维护一个关于字符串的“拘留池”来优化字符串的管理。若分配给字符串变量的值与“拘留池”内已经存在的某字符串的值相等,则不在分配额外的内存且该变量将得到池内字符串地址。编译器可以通过“拘留池”优化字符串的初始化,并可以使两个字符串变量指向内存中同一String对象。然而,这种优化操作并不是在运行时执行的。 举个例子: Dim s1 As String = "1234" s1 &= "5678" Dim s2 As String = "12345678" Console.WriteLine( s1 Is s2 ) ' ==> False
同样的,可以通过下面的例子证明String是引用类型而不是值类型:Dim s1 As String = "ABCD" Dim s2 As String = s1 Console.WriteLine( s1 Is s2 ) ' ==> TrueDim s1 As String = "ABCD" Dim s2 As String = "ABCD" Console.WriteLine( s1 Is s2 ) ' ==> True
{
string str1,str2;
str1="abc";
str2="xyz";//修改的
Console.WriteLine("First,str1={0}, str2={1}",str1,str2);
str2="def";
str1 = str2;//修改的
Console.WriteLine("Again,str1={0}, str2={1}",str1,str2);
return(0);
}
这样试试?
我认为String将"="重载过,这可以解释前一个程序
面第二个的str1和str2是对class2的引用,class2没有对"="重载,所以只有一个class2的实例,当然也只有一个String,所以会出现这种结果
举个例子:
Dim s1 As String = "1234"
s1 &= "5678"
Dim s2 As String = "12345678"
Console.WriteLine( s1 Is s2 ) ' ==> False
Dim s2 As String = s1
Console.WriteLine( s1 Is s2 ) ' ==> TrueDim s1 As String = "ABCD"
Dim s2 As String = "ABCD"
Console.WriteLine( s1 Is s2 ) ' ==> True
用string定义变量时,重新申请了内存地址;
用Class是申请的同一内存地址。
{
string str1,str2;
str2 = "abc";
str1 = str2;
str2 = "xyl";
Console.WriteLine("str1 = {0:s}\r\nstr2 = {1:s}\r\n",str1,str2);
string strT = (str1 == str2 ? "是指向同一地址":"不是");
Console.WriteLine(strT);//输出结果:不是
}
class2 str1,str2;
输出:
First,str1=abc, str2=abc
Again,str1=def, str2=def本来就是这样才对!关string什么事情
class 是引用类型,当然修改了str2.s就相是修改了str1.s这也不明白
String对"=="也重载了