下面是我关于值类型与引用类型的一些思考,错误之处肯定有的,欢迎高人批评指正,帮助进步
C#中,值类型和引用类型是两个非常重要的概念,下面尽量详细的阐述,观点不一定完全正确,欢迎批评指正。
1.内存分为堆和栈,值类型的数据存储在栈中,引用类型的数据存储在堆中。
2.int numb=10,代码中的10是值类型的数据,numb只是一个指向10的变量而已。其中10存储在栈中,变量numb也存储在栈中。
3.Person p=new Person(),代码中 new Person()所创建的对象存储在堆中,变量p存储在栈中。
4.综合第2点和第3点所有变量都存储在栈中,无论此变量存储的值是值类型和引用类型。
5.值类型包括枚举,结构以及像int,datetime这样的简单类型;引用类型包括类,接口,委托等。
6.值类型传递的值的拷贝,引用类型传递的是值的引用,即此数据在内存中的地址,这是最核心的概念,实例展示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
class Program { static void Main( string []
args) { Person
yaohongbo = new Person()
{ Name = "姚宏波" ,
Age = 29 }; Person
lilei = new Person()
{ Name = "李雷" ,
Age = 22 }; int age
= yaohongbo.Age; yaohongbo.Age
= 27; Person
zhangsan = lilei; lilei.Name
= "李磊" ; Console.WriteLine( "yaohongbo的age:" +yaohongbo.Age); Console.WriteLine( "age:" +
age); Console.WriteLine( "lilei的name:" +
lilei.Name); Console.WriteLine( "zhangsan的name:" +
zhangsan.Name); Console.ReadKey(); } } class Person { public string Name
{ get ; set ;
} //引用类型 public int Age
{ get ; set ;
} //值类型 } |
输出结果如下图:
代码说明:yaohongbo.Age是int类型,为值类型,所以代码int age=yaohongbo.Age,是将yaohongbo.Age变量存储的值复制了一份,然后让变量age存储这份拷贝,此拷贝和yaohongbo.Age无任何关系,所以我们才可以看到上面的输出结果。
再看代码:
1
2
|
Person
zhangsan = lilei; lilei.Name
= "李磊" ; |
Person为自定义类,为引用类型,而引用类型穿的是引用,变量zhangsan指向的数据和变量lilei是同一个内存地址,即同一个对象,而不是像值类型那样,拷贝了一份变量lilei指向的数据给变量zhangsan。所以才会出现无论更改zhangsan韩式lilei的属性值,其他一个都会改变的情况。
最后通过一张图来描述上面代码。