【C#】值类型和引用类型
学了这么久的C#了,还是对基本格式不太熟悉,所以博客开始先来介绍一下C#的基本格式。
基本格式
以图为例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
这个是引入类库,System是所有.net官方类库的最基本命名空间,所以每个C#开头都会看到这一句。
namespace _02指引
这一句是声明命名空间,以便在其他文件中用using指令引入,如果其它源文件需要这个命名空间内的方法,只需要using_02指引即可。
class Program
这一句是声明一个类,因为C#是完全面向对象的语言,所以所有的内容都必须放入类里面,这一句是声明一个叫Program的类
static void Main(string[] args)
这一句之前一直让人比较困惑,看到括号里面我甚至认为这是声明了一个args的字符串数组,其实不然,这一句是主函数,是文件的入口函数,编译这个源文件后悔直接执行这个函数,和以前学习vb中main函数没声明区别。
值类型和引用类型
前面我们介绍了C#的基本格式,那么值类型和引用类型是哪一级呢?当然是类啦。不过类与类也是有差别的。
类的定义格式为 [访问修饰符] class 类名
类中类型的声明就在不同于class,值类型用class声明,引用类型用struck声明。
值类型和引用类型的区别
说了这么多,两种类型到底有什么区别。
1.将一个值类型变量赋给另一个值类型变量时,将复制包含的值。引用类型变量的赋值只赋值对对象的引用,而不复制对象本身。
2.值类型不能包含null值。
3.每种值类型均有一个隐式的默认构造函数来初始化该模型的默认值。
总而言之,值类型的值存在栈上,引用类型栈上存的是地址,值在堆上。
堆和栈的区别
栈是便一起建就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;局部值类型变量、值类型参数等都在栈内存中。
堆是程序运行期间动态分配的内存空间,我们可以根据程序的运行情况确定要分配的堆内存的大小。
最后区分一下类中哪些为值类型,哪些为引用类型。