再谈值类型和引用类型

本文通过实例对比了值类型和引用类型的特性,展示了不同类型变量在赋值及修改过程中的行为差异,并特别讨论了string类型的特殊性。
从概念上说
值类型就是变量包含的是具体的值
引用类型就是变量包含的是对具体值得引用,就是指针啦。
我们通过代码来演示

1None.gifpublicclassSpace
2ExpandedBlockStart.gifContractedBlock.gifdot.gif{
3InBlock.gif
4InBlock.gifpublicstaticvoidMain(string[]args)
5ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
6InBlock.gif
7InBlock.gif
8InBlock.gifinti=10;
9InBlock.gifintj=i;
10InBlock.gifSystem.Console.WriteLine(i.Equals(j));//true
11InBlock.gifSystem.Console.WriteLine(object.ReferenceEquals(i,j));//false
12InBlock.gif
13InBlock.gif
14InBlock.gifOrderorder1=newOrder("123");
15InBlock.gifOrderorder2=order1;
16InBlock.gifSystem.Console.WriteLine(order1.Equals(order2));//true
17InBlock.gifSystem.Console.WriteLine(object.ReferenceEquals(order1,order2));//true
18InBlock.gifSystem.Console.WriteLine(order2.Number);
19InBlock.gif
20InBlock.gif
21InBlock.gifj=15;
22InBlock.gifSystem.Console.WriteLine(i);//i依然是10
23InBlock.gif
24InBlock.giforder2.Number="999";
25InBlock.gifSystem.Console.WriteLine(order1.Number);//结果是999
26InBlock.gif
27ExpandedSubBlockEnd.gif}

28ExpandedBlockEnd.gif}

29None.gif
30None.gif
31None.gifpublicclassOrder
32ExpandedBlockStart.gifContractedBlock.gifdot.gif{
33InBlock.gifpublicOrder(stringnumber)
34ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
35InBlock.gifNumber=number;
36ExpandedSubBlockEnd.gif}

37InBlock.gifpublicstringNumber;
38InBlock.gif
39ExpandedBlockEnd.gif}

40None.gif

仔细看看上面的代码

int类型是值类型,因此第9行是把i的值赋给了j,第11行检查i和j的地址,得到的结果是i和j的地址是不一样的。

Order是类,类是引用类型。第15行是把order1的地址赋给了order2,所以这时候order1和order2的引用地址是一样的。

由于i和j的地址是不一样的,所以第21行修改了j的值,i的值是不受影响的。

由于order1和order2的引用地址是一样的,所以24行修改了order2的值,其实也就是改了order1的值。

不过呢,凡事有例外,比如string。

string虽然是引用类型,不过string有固化的特征,就是说string不能被改变,所有改变string的现象其实是产生了一个新的string。为什么?答案其实很简单,string是char[]的表现形式,数组是连续分配的固定空间,数组的长度并不可以被改变,因此推导:string是固化的。

以下代码请好好琢磨:
1None.gifstrings1="hello";
2None.gifstrings2=s1;
3None.gifSystem.Console.WriteLine(s1.Equals(s2));//true
4None.gifSystem.Console.WriteLine(object.ReferenceEquals(s1,s2));//true
5None.gif
6None.gif
7None.gifs2="C#";
8None.gifSystem.Console.WriteLine(s1.Equals(s2));//false
9None.gifSystem.Console.WriteLine(object.ReferenceEquals(s1,s2));//false


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值