C#的常用类型
1.值类型
值类型就是直接包含值的。值类型需要的内存量会在编译的时候固定下来,不会再运行时改变。因为大小是固定的,所以值类型可以存储在栈的内存中。
简单值类型--包括 整数类型 、字符类型、实数类型、布尔类型 复合值类型--包括 结构类型 、枚举类型1.1 数值类型
整数类型int, 32位的存储
浮点类型,表示取值在某一个数据范围类有细微误差值,浮点的精度是由有效数字决定的。
decimal,128位存储,常用来描述金钱数量级。
double,double的预期精度小数点后14位。
1.2更多类型
布尔类型,ture或false,条件语句用于判断。
char类型,取值范围对应Unicode字符集(Unicode国际性标准,表示大多数语言中的字符。)
字符串,在字符串前面使用@,指明转义序列不被处理。
1.3数组
C#数组声明
一维数组 string[] languages;
二维数组 string[,] cells; string[][] cells;
string result = “we love chengdu”;
string[] resultArray =result.ToCharArray();
2.引用类型
类、接口、委托和数组引用类型是对内存中的一个位置的引用,与实际数据存储的位置不同。引用类型指向内存区域称为堆(heap)。
struct类型,可包含带参数构造器和方法,不支持终结器。
装箱:从一个值类型转换成为一个引用类型的时候叫装箱。
拆箱:从一个引用类型转换成为一个值类型的时候交拆箱。
如果一个程序中有过于多次的装箱和拆箱过程会很大程度的降低程序的执行效率。
PS:通过接口可以避免拆箱。因为接口是引用类型,所以在通过接口访问已装箱的值不用拆箱操作。
枚举类型:C#的枚举类型之间不能直接转换,如果需要转换那么先转换成为一个数组,然后再转型为第二个枚举。(PS这两个枚举中的类型都一致)
3.两个奇怪的类型null和void
null表示变量不引用任何有效的对象。
null是不能赋值给值类型的,因为所有的值类型都必须要初始值,如果赋值为int或FLOAT就会出现类型不匹配。
void表示没有类型,或者没有任何值。
void本质上并不是一个数据类型,它只用于指明没有数据这一个事实。
类型之间相互转换规则
显式转换
对有可能丢失数量级或者引发一场的任何转换都需要执行显示转型。 否者会引发System.OverflowException
隐式转换
对不会丢失数量级,不会引发异常的转换直接使用隐式转换。
是怎么完成了类型转换的?
值类型的转换
对于值类型转换,相当于新开一个内存分配空间,然后把原有的值放入。在这个过程中,如果新分配的内存空间可以足够存放原有数据类型的精度那么就可以实现隐式转换。如果新分配的内存空间不足于存放原有数据类型的精度那么就需要强制类型转换,强制类型转换过程中就会导致System.OverflowException异常的出现。
引用类型的转换
所有的类型转换都是内存分配的策略。引用类型转换,多出现在类、接口、委托等这些类型上面,类的类型转换只有子类可以隐式转换为父类,而父类必须强制转换成为子类。原因是由于类中存在继承的机制,比如系统为父类分配了一段内存空间用于存放内存名称。在实现子类继承父类的时候就是向原有的类存空间新加入了一段附加的类存空间用于表明此类是继承于该父类的。所以子类就可以添加属于自己的方法或属性。