天天看點

再談值類型和引用類型

從概念上說

值類型就是變量包含的是具體的值

引用類型就是變量包含的是對具體值得引用,就是指針啦。

我們通過代碼來示範

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

繼續閱讀