從概念上說
值類型就是變量包含的是具體的值
引用類型就是變量包含的是對具體值得引用,就是指針啦。
我們通過代碼來示範
1
public class space
2
{
3
4
public static void main(string[] args)
5
6
7
8
int i = 10;
9
int j = i;
10
system.console.writeline(i.equals(j));//true
11
system.console.writeline(object.referenceequals(i,j));//false
12
13
14
order order1 = new order("123");
15
order order2 = 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
public class order
32
33
public order(string number)
34
35
number = number;
36
37
public string number;
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是固化的。
以下代碼請好好琢磨:
string s1 = "hello";
string s2 = s1;
system.console.writeline(s1.equals(s2));//true
system.console.writeline(object.referenceequals(s1, s2));//true
s2 = "c#";
system.console.writeline(s1.equals(s2));//false
system.console.writeline(object.referenceequals(s1, s2));//false