标签:style blog http color io ar 数据 sp div
记得大三上学期上C#课程的时候,老师第一堂课就重点给我们讲了一下C#中的数据类型。我们都知道,C#是一门强类型的高级编程语言,了解它的数据类型是非常有必要的。老师当时给我们列举了很多数据类型,然后问我们哪些是值类型,那些是引用类型。说实话,当时对于这个问题还真是回答不上来,或许可以说是自己没有多少底气回答。虽然大一学C++的时候接触过值类型和引用类型,但是因为没有深究,或者根本没有真正了解他们的区别,以至于在自己写代码时无形当中用到了却还是不了解它们之间的具体区别。
现在大四了,也到了快紧张面试的时候,自己也会去找一些关于.net方面的面试题看。通过一些途径了解到,有很多企业在面试时把基础放在重要的位置,像今天所说的值类型和引用类型的问题在ASPNet等Web方向的面试中就可能经常出现,所以我觉得很有必要好好弄清以下这两个概念以及它们之间的区别。
以前,在我印象中,可能就是把值类型理解为我们常用的那些基本数据类型(整形、浮点型、字符型、字符串、结构体等等),把引用类型理解为类、指针等,其实这样的理解是不全面的甚至可以说是错误的。那么究竟什么是值类型,什么又是引用类型呢?
整体来说,C#的值类型有:
整型:int;长整型:long;浮点型:float;字符型:char;布尔型:bool;枚举:enum;结构体:struct
C#的引用类型有:
类:class;接口:interface;数组:int[],string[];委托;装箱值类型
为了方便大家记忆和理解,我从网上找来一张图展示值类型和引用类型,清晰易懂
我们可以看到,C#中的值类型包括7种数据类型,这里要特别注意,并不是所有的基本数据类型都是值类型,像string就是引用类型,我们可以把它看成一个类。还有一点,结构体虽然与类有点相似,但它是值类型,类是引用类型,这是他们主要的区别之一。然后引用类型中类和接口大家都能接受,但是不能忘了数组也是引用类型,委托和装箱值类型因为目前我还不是很了解,所以只能强记了。但是说到委托,那必须值得一提,这是C#中一个非常重要的知识点,函数名作为参数传递调用是多么的神奇,想想就有点小激动。但现在写代码我几乎没怎么用委托,由此看来我必须要好好了解一下委托,找机会针对委托写一片关于“探索C#中的委托”的博客。
了解了值类型和引用类型之后,那它们的区别是什么呢?
从概念上看,值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。
从内存空间上看,值类型的数据存储在内存的栈中,作用域结束时,所占空间自行释放,效率高,无需进行地址转换;而引用类型的数据存储在内存的托管堆中,内存单元中只存放堆中对象的地址,由GC来控制其回收,需要进行地址转换,效率降低,这也正是C#需要定义两种数据类型的原因之一。
值类型和引用类型在函数参数传值时是有区别的,首先来看一段经过自己运行并成功的代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class Person { public int Blood = 10; } class Program { public static void Add(int x) { x += 10; Console.WriteLine("值类型当参数被传递并修改之后:" + x); } public static void Add(Person person) { person.Blood += 10; Console.WriteLine("引用类型当参数被传递并修改之后:" + person.Blood); } static void Main(string[] args) { //值类型变量 int i = 10; Console.WriteLine("i的原值:" + i); Add(i); Console.WriteLine("但是i的值并没有因为函数的修改而修改:" + i + ‘\n‘); //引用类型变量 Person person = new Person(); Console.WriteLine("Blood的原值:" + person.Blood); Add(person); Console.WriteLine("但是Blood的值因为函数的修改而修改:" + person.Blood); //值类型和引用类型的区别,就在于当函数参数传递的时候. //值类型是把自己的值复制一份传递给别的函数操作.无论复制的值怎么被改变.其自身的值是不会改变的 //而引用类型是把自己的内存地址传递给别的函数操作.操作的就是引用类型值的本身.所以值被函数改变了. //这就是传值和传址的区别 Console.ReadLine(); } } }
从以下结果可以看到两种类型函数传参时的区别:(以上代码中的注释解释了原因)
那么文章就先写到这里了,初次写博客,或许存在很多问题,如有问题欢迎大家指出,我将认真改正。写这篇博客是为了让自己在写的过程中理解一些知识及备忘,研究的并不是那么深入,或许不够完善,还望大家见谅。
标签:style blog http color io ar 数据 sp div
原文地址:http://www.cnblogs.com/contact/p/3984558.html