------------------------------------------------------------------------------------------------------------------------------------------------------------------
重新理解一下C#中的值类型和引用类型,在以前读《C#高级编程(第三版)》时,也是粗略看了一下,没有在意,直到今天,重新认识了这个东西。
一、值类型:存储在堆栈中;引用类型:存储在托管对上;
二、值类型进行“=”操作时,会创建值类型的复制版本;
值类型:

值类型事例
1
int i = 20;
2
3
int j= i;
4
5
Console.WriteLine(string.Format("i={0}\tj={1}", i.ToString(), j.ToString())); // i = 20,j = 20
6
7
j = 30;
8
9
Console.WriteLine(string.Format("i={0}\tj={1}", i.ToString(), j.ToString())); // i = 20,j = 30
引用类型:[ 建设已经定义了一个 Example 类 ]

引用类型事例
1
Example exI = new Example ();
2
3
exI .i = 20;
4
5
Example exJ = exI;
6
7
Console.WriteLine(string.Format("exI.i={0}\texJ .i={1}", exI.i.ToString(), exJ .i.ToString())); // 20,20
8
9
exJ .i = 30;
10
11
Console.WriteLine(string.Format("exI.i={0}\texJ .i={1}", exI.i.ToString(), exJ .i.ToString())); // 30,30
12
[说明:引用类型中,不用 string 做事例是因为它太特殊了,最主要的是自己还没有弄清楚这个东西,但是直到一点:“string 是引用类型,表现上却是值类型的特征。”,不知道为什么这么说?]
三、理解值类型和引用类型。值类型就是基本类型,int,long,double,bool,struct,enum 都是值类型;引用类型就是string 和自定义类 [面向对象里面的对象],可以将引用类型看成C++ 或 C中的指针,都指向内存中的一个地址,修改任何一个指向这个地址对象,其他的对象值都改变。这个东西的监视是由CLR负责接管的,不用我们操心了。

值类型、引用类型理解
1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4
5
namespace ConsoleTest
6

{
7
class Program
8
{
9
static void Main(string[] args)
10
{
11
// 外围设置值
12
int j = 200;
13
string str = "out string";
14
example ex = new example(100, "out property");
15
16
// 显示当前值
17
Console.WriteLine("Before test():\n\tex.i={0}\tex.str={1}\tj={2}\tstr={3}", ex.i.ToString(), ex.str, j.ToString(), str);
18
19
// 函数中更改值
20
test(ex,j,str);
21
22
// 显示调用后值
23
Console.WriteLine("After test():\n\tex.i={0}\tex.str={1}\tj={2}\tstr={3}", ex.i.ToString(), ex.str, j.ToString(), str);
24
25
26
Console.Read();
27
}
28
29
private static void test(example ex, int j, string str)
30
{
31
// 函数内更改各值
32
j = 880; // 值类型
33
str = "inner string"; // 引用类型,表现为值类型 [最特殊]
34
ex.i = 880; // 引用类型,值类型属性
35
ex.str = "inner property"; // 引用类型,引用类型属性
36
37
// 显示更改后的值
38
Console.WriteLine("Inner test():\n\tex.i={0}\tex.str={1}\tj={2}\tstr={3}", ex.i.ToString(), ex.str, j.ToString(), str);
39
}
40
}
41
42
internal class example
43
{
44
public int i = 0;
45
public string str = "example string";
46
47
public example(int j, string s)
48
{
49
this.i = j;
50
this.str = s;
51
}
52
}
53
}
54
55
结果:
Before test():
ex.i=100 ex.str=out property j=200 str=out string
Inner test():
ex.i=880 ex.str=inner property j=880 str=inner string
After test():
ex.i=880 ex.str=inner property j=200 str=out string