类型
C#是一组类型声明,这个与第三章:命名空间就是一组类型声明可以一起理解。类型是一个用来创建数据结构的模板:
使用这个模板创建对象的过程叫做实例化,所以创建的对象也叫实例
类型成员
简单类型可能只包含一个数据成员,例如int short long这些类型
其他的类型可能包含多个数据成员,如数组,还可能包含函数成员
预定义类型
C#共有16种预定义类型,特殊的以红框框出:
- sbyte和byte是比short范围更小的类型
- decimal是高精度小数类型,可以精确表示分数,常用于货币计算
- object是所有其他类型的基类
- dynamic,使用动态语言编写的程序集使用
- char是Unicode字符类型,string是Unicode字符数组
自定义类型
用户可以创建六种自定义类型
预定义类型与自定义类型的区别是,自定义类型需要进行声明,声明包含1.要创建6种类型中的哪一种;2.类型的名字;3.类型种成员的声明(array和delegate除外)
堆栈
程序运行时的数据必须储存在内存中的两个区域:堆和栈
栈:先入后出
堆
堆是一块内存区域,可以分配大块的内存用于存储,堆的进出没有限制。
堆虽然可以保存数据,但是不能显式地删除数据,只能由CLR的GC(垃圾回收)判断进行回收:
值类型和引用类型
类型决定了数据项在内存的位置——堆或栈
上图中引用类型的数据并不是成员对象,当其为成员对象时会有所不同。
对于引用类型的任何对象,其数据成员全部都在堆里,无论它是值类型还是引用类型:
变量
(float不是引用类型吗?)
变量初始化
初始化就是用等号赋值,没有初始化的局部变量无法直接使用。
自动初始化
一些类型的变量即使不初始化也会自动初始化:
多变量声明
多变量声明类型必须相同,并且用逗号隔开
静态类型和dynamic关键字
编译器通过类型名来确定分配多少内存,以及哪些放在堆里哪些放在栈里,这样变量的类型在编译时就确定下来并且不能在运行时修改就叫做静态类型
使用dynamic关键字后,编译器就不会解析变量类型,反而会将其所有内容打包,在运行时一并检查,确保与变量实际类型一致。
深入理解C# 静态类与非静态类、静态成员的区别
可空类型
C# 提供了一个特殊的数据类型,nullable 类型(可空类型),可空类型可以表示其基础值类型正常范围内的值,再加上一个 null 值。
例如,Nullable< Int32 >,读作"可空的 Int32",可以被赋值为 -2,147,483,648 到 2,147,483,647 之间的任意值,也可以被赋值为 null 值。
声明一个 nullable 类型(可空类型)的语法如下:
< data_type> ? <variable_name> = null;
int i; //默认值0
int? ii; //默认值null
设置可空类型就可以在使用变量前确定其有效性。