string类的困惑

<script type="text/javascript"> // </script>

对于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
解答:
下面给出的那个例子跟String的例子并没有可比性,因为下面的例子并没有出现改变引用本身的语句,因为s1="world"不等同于t1.Number=20,而是等同与t1=new Test();t1.Number=20
s1 = "world",相当于是s1 = new string("world");已经是一个新的实例了,这是string类的特点!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值