对于string类的困惑

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

看下面这段代码,class很明显也是一个reference,但是结果却和上面不同。
None.gif //  类的定义
ExpandedBlockStart.gifContractedBlock.gif
public   class  Test dot.gif {
InBlock.gif    
private int number;
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public Test(int number)dot.gif{
InBlock.gif        
this.number = number;
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public int Numberdot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
getdot.gif{return number;}}

ExpandedSubBlockStart.gifContractedSubBlock.gif        
setdot.gif{number = value;}
ExpandedBlockEnd.gif    }

None.gif
ExpandedBlockStart.gifContractedBlock.gif    
public   override   string  ToString() dot.gif {
InBlock.gif        
return Number.ToString();
ExpandedBlockEnd.gif    }

None.gif}
None.gif
None.gif
//  测试代码
None.gif
Test t1  =   new  Test( 10 );
None.gifTest t2 
=  t1;
None.gifConsole.WriteLine(t1.ToString());
None.gifConsole.WriteLine(t2.ToString());
None.gift1.Number 
=   20 ;
None.gifConsole.WriteLine(t1.ToString());
None.gifConsole.WriteLine(t2.ToString());

上述代码输出的,是我们期望的值:
10
10
20
20
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值