对于string类的困惑

我们都知道,string类是一个reference type。看下面这段代码:
string s1 = "hello";
string s2 = s1;
Console.WriteLine(s1);
Console.WriteLine(s2);
s1 
= "world";
Console.WriteLine(s1);
Console.WriteLine(s2);
按理来说,s1被赋予world之后,那么s2应该也是指向这段内存空间,输出world,但实际上不是这样。
代码输出为:
hello
hello
world
hello
C#高级编程中是这么解释的,s1被修改后,会重新分配一块内存,来指向新的s1。这是解释了为什么会有这个结果。但是,它没有解释,CLR为什么要这么特殊处理string类。难道,因为string类用的特别多,要符合大家的使用习惯?

看下面这段代码,class很明显也是一个reference,但是结果却和上面不同。
// 类的定义
public class Test{
    
private int number;

    
public Test(int number){
        
this.number = number;
    }


    
public int Number{
        
get{return number;}}

        
set{number = value;}
    }


    
public override string ToString(){
        
return Number.ToString();
    }

}

// 测试代码
Test t1 = new Test(10);
Test t2 
= t1;
Console.WriteLine(t1.ToString());
Console.WriteLine(t2.ToString());
t1.Number 
= 20;
Console.WriteLine(t1.ToString());
Console.WriteLine(t2.ToString());

上述代码输出的,是我们期望的值:
10
10
20
20
posted @ 2004-08-30 09:04  鞠强  阅读(3700)  评论(30编辑  收藏  举报

hello

world