从概念上说
值类型就是变量包含的是具体的值
引用类型就是变量包含的是对具体值得引用,就是指针啦。
我们通过代码来演示
仔细看看上面的代码
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是固化的。
以下代码请好好琢磨:
值类型就是变量包含的是具体的值
引用类型就是变量包含的是对具体值得引用,就是指针啦。
我们通过代码来演示
1
publicclassSpace
2

{
3
4
publicstaticvoidMain(string[]args)
5

{
6
7
8
inti=10;
9
intj=i;
10
System.Console.WriteLine(i.Equals(j));//true
11
System.Console.WriteLine(object.ReferenceEquals(i,j));//false
12
13
14
Orderorder1=newOrder("123");
15
Orderorder2=order1;
16
System.Console.WriteLine(order1.Equals(order2));//true
17
System.Console.WriteLine(object.ReferenceEquals(order1,order2));//true
18
System.Console.WriteLine(order2.Number);
19
20
21
j=15;
22
System.Console.WriteLine(i);//i依然是10
23
24
order2.Number="999";
25
System.Console.WriteLine(order1.Number);//结果是999
26
27
}
28
}
29
30
31
publicclassOrder
32

{
33
publicOrder(stringnumber)
34

{
35
Number=number;
36
}
37
publicstringNumber;
38
39
}
40
publicclassSpace2


{3

4
publicstaticvoidMain(string[]args)5


{6

7

8
inti=10;9
intj=i;10
System.Console.WriteLine(i.Equals(j));//true11
System.Console.WriteLine(object.ReferenceEquals(i,j));//false12

13

14
Orderorder1=newOrder("123");15
Orderorder2=order1;16
System.Console.WriteLine(order1.Equals(order2));//true17
System.Console.WriteLine(object.ReferenceEquals(order1,order2));//true18
System.Console.WriteLine(order2.Number);19

20

21
j=15;22
System.Console.WriteLine(i);//i依然是1023

24
order2.Number="999";25
System.Console.WriteLine(order1.Number);//结果是99926

27
}28
}29

30

31
publicclassOrder32


{33
publicOrder(stringnumber)34


{35
Number=number;36
}37
publicstringNumber;38

39
}40
仔细看看上面的代码
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是固化的。
以下代码请好好琢磨:
1
strings1="hello";
2
strings2=s1;
3
System.Console.WriteLine(s1.Equals(s2));//true
4
System.Console.WriteLine(object.ReferenceEquals(s1,s2));//true
5
6
7
s2="C#";
8
System.Console.WriteLine(s1.Equals(s2));//false
9
System.Console.WriteLine(object.ReferenceEquals(s1,s2));//false
strings1="hello";2
strings2=s1;3
System.Console.WriteLine(s1.Equals(s2));//true4
System.Console.WriteLine(object.ReferenceEquals(s1,s2));//true5

6

7
s2="C#";8
System.Console.WriteLine(s1.Equals(s2));//false9
System.Console.WriteLine(object.ReferenceEquals(s1,s2));//false
本文通过实例对比了值类型和引用类型的特性,展示了不同类型变量在赋值及修改过程中的行为差异,并特别讨论了string类型的特殊性。
852

被折叠的 条评论
为什么被折叠?



