c#包含两大数据类型:值类型和引用类型。值类型包括简单类型、结构体类型和枚举类型,引用类型包括自定义类、数组、接口、委托等
内存基本被划分为两大部分:堆和栈。
从内存分配上来看,值类型通常分配在线程的堆栈上,作用域结束时,所占空间自行释放,效率高,无需进行地址转换,而引用类型通常分配在托管堆上,由GC来控制其回收,需要进行地址转换,效率降低,这也正是c#需要定义两种数据类型的原因之一。
值类型均隐式派生自System.ValueType,而System.ValueType又直接派生于System.Object,每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值,注意所有的值类型都是密封(sealed)的,所以无法派生出新的值类型。而且System.ValueType本身是一个类类型,而不是值类型,因为它重写了object的Equals()方法,所以对值类型将按照实例的值来比较,而不是比较引用地址。
注:栈是操作系统分配的一个连续的内存区域,用于快速访问数据。因为值类型的容量是已知的,因此它可存储在栈上。而托管堆是CLR在应用程序启动时为应用程序预留的一块连续内存区,是用于动态内存分配的内存区,引用类型的容量只有到运行时才能确定,所有用堆来存储引用类型。
struct和class的区别
struct是值类型,class是引用类型,因此它们具有所有值类型和引用类型之间的差异。由于堆栈的执行效率要比堆的执行效率高,但是堆栈资源却很有限,不适合处理逻辑复杂的大对象,因此struct常用来处理作为基类型对待的小对象,而class来处理某个商业逻辑。
从继承性来看,struct既不能继承也不能被继承,但是可以实现接口,而Class就可以完全扩展了。
内部结构有区别,struct只能添加带参的构造函数,不能使用abstract和protected等修饰符,不能初始化实例字段,但是值得注意的是,struct可以重写System.Object的3个虚方法,Equals()、ToString()和GetHashTable(),Class没有这些限制。
比较struct和class的不同,可以得出以下几条struct和class的使用原则:
1 在表示诸如点、矩形等主要用来存储数据的轻量级对象时,首选struct。
2 在表示数据量大、逻辑复杂的大对象时,首选class。
3 在表现抽象和多级别的对象层次时,class是最佳选择。
类型转换
C#允许将范围较小的某种类型的值赋给范围较大的目标类型
而窄化可能导致数据丢失,需要用check关键字来抛出异常
流程控制
switch 只能作用于类型为可静态执行的表达式,只限于基本类型,string类型和enum类型,每一条case从句的末尾都必须使用跳转语句
for循环:初始化从句;条件从句;迭代从句
foreach:遍历一个可枚举对象的每一个元素
跳转语句:在跳转目标之前跳出try语句块,则始终会执行finally的语句块
break:用于结束循环体中的循环
continue:放弃本次循环中的余下语句,提前下一次的迭代过程
goto语句:转向语句块中的另一个标记的位置开始执行
return:存在于方法中,返回一个与该方法返回类型一致的表达式
throw:抛出异常