一、C#数据类型:
A:值类型
值类型变量可以直接分配一个值,它是从System.ValueType派生而来,值类型直接包含数据,比如int,char,float,他们分别存储整型数据,字符,浮点数,当你申明一个值类型时,系统分别空间来存储值类型的数据,值类型包含以下类别:
此外,结构体,及枚举类型也都属于值类型。
B:引用类型
引用类型不包含存储在变量中的实际数据,但是它们包含对数据的引用,换句话说,它指向内存中的位置,如果内存中的数据是由一个变量改变的,其它变量也会自动反映这种变化,内置的引用类型有object,dynamic,String
1.object类型
object类型是C#通用类型系统所有数据类型的终极基类,Object是System.Object类的别名,所以Object类型可以被分配成任何其它类型(值类型、引用类型、预定义类型或用户自定义类型)的值,但是在分配之前需要进行类型转换。当一个值类型转换为引用类型时称为装箱,当一个值类型转换为Object时称为拆箱,拆装箱是非常损耗内存的,会影响程序的执行效率,所以要尽量避免执行拆装箱操作。
int ii=9; object o = ii;
object o = 9; int ii = (int)o;
2.dynamic类型
您可以存储任何类型的数据在动态类型中,这些变量类型检查是在程序运行时发生的。动态类型和对象类型相似,但是对象类型的类型检查是在编译时发生的,而动态类型变量的类型检查是在运行时发生的。
dynamic type; type = "11111";
3.string类型
允许您给变量分配任何字符串值,字符串的赋值比较特别,字符串是"不可变的",对字符串的操作实质是返回新的字符串操作,
string str1 = "A"; string str2 = "B"; str1 += str2;
执行完代码后 str1 = "AB",str1指向了新的内存空间,但是之前的A并没有消失,还占据着内存等着GC对其进行回收。
假如大量操作字符串会令程序性能下降,所以产生了StringBuider
StringBuilder sb = new StringBuilder("Hello"); sb.Append("Word"); sb.Append("!");
只有在大量进行字符串操作时才能体现出StringBuilder的优势
用户自定义类型包括 Class,delegate,interface
C:指针类型
C#中的指针类型和C,C++中的一样,都是指向一片内存地址,但是在C#中尽量少用指针类型。
二、C#中数据类型转换
数据类型的转换包括显示类型转换和隐式类型转换,
1.隐式类型转换
隐式类型转换主要发生在C#默认数据转换是安全的情况下,比如int型赋值给double型:
int i = 3; double d = i;
一般情况下小转大不会发生数据的丢失,所以可以用隐式类型转换.
2.显示类型转换
显示类型转换包含两种:
一种是将字符串转换为想要的数据类型,Parse
string str = "3"; i = int.Parse(str);
这种转换方式有一个弊端,那就是待转换的字符串确实可以转换为int,一旦待转换的字符串不可以转换成为对应的类型,就会报错。为了克服这个弊端,可以用TryParse
另一种就是万能转换Convert.To
string str = "3"; double s = Convert.ToDouble(str);