C#总结(二)

四、值类型和应用类型
1、 值类型的变量直接包含值,将一个值类型变量赋给另一个值类型变量时,是将包含的值复制给了它进行初始化,之后在变就不管原变量的事了
每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。
 
2,引用类型是另建立一个指针,指向同一地址(托管堆中)
引用类型的变量又称为对象,可存储对实际数据的引用
3 值类型表示实际的数据(将值存储在内存中),而应用类型表示指向数据的引用,包含内存堆中对象的地址(真正的数据存储在托管堆中)
4、具体分类:
值类型: 简单类型(有符号整型,无符号×××,Unicode字符,IEEE浮点数,高精度小数,布尔型), 枚举类型 ,结构类型
引用类型:类类型,接口类型,Unicode字符串,数值类型,委托类型
五、装箱和拆箱 ===(发生在值类型和引用类型之间)
 1,装箱:装箱是值类型到 object 类型或到此值类型所实现的任何接口类型的隐式转换。对值类型装箱会在堆中分配一个对象实例,并将该值复制到新的对象中。
2、取消装箱是从 object 类型到值类型或从接口类型到实现该接口的值类型的显式转换
3、int i = 123;
object o = i; (装箱操作)
int j = (int)o; (拆箱操作)
double=(int )o; (拆箱之后,又进行了隐式转换)
 float  i = 123;
 object o = i;   
             
 int  m = (int)(float)o;(拆箱之后又进行了显式转换)
总之:装进去是什么类型,拆箱时必拆出来什么类型。拆完之后再做什么转换就没有限制了
六、string和stringBuilder
1、代表一个不可变的顺序字符集。它是一个引用类型,直接派生自Object。它是直接复制来构造的
2、String str=new String(“大家好”)-----错误的
 String a=”你好”;----正确的写法
3、String一旦定义,就是不可变的,如果字符串发生变化,就会生成新的字符串(在托管堆中再分块内存,原来的被释放掉)
   string a = "1" + "3"; //这是操作的一种特殊例子(只有一块)     
 在托管堆中开一内存区域“13” ,通过指针指向a
a += "2"; 原内存被释放掉,又有一块新的“132”,指针指向a
一旦对字符串进行操作,内存重分,(以上特例除外 ) 原来释放掉
4、    string a = "1" + "3";
string b = "13";
未对b重分内存,只是又为原内存连了一条指针,指向b
a b指向同一块内存
以上就是---字符串的留用
5、鉴于string 的不可变性,StringBuilder(system.text命名空间下)通过维护一个char的数组来对字符串执行动态操作,在下面两种情况下会分配新对象:
      试图动成构造一个字符串,它的长度超过了事先设置的容量。
      试图在调用了StringBuilder的ToString方法之后修改数组
(注:StringBuilder在内部维护着一个string的字段,如果调用StringBuilder.ToString方法,这个字段就会被赋值,并且不能修改,所以一旦调用了ToString方法,内部的Char数组就会重分配。)
6、二者的比较
      String 或 StringBuilder 对象的串联操作的性能取决于内存分配的发生频率。
       String 串联操作每次都分配内存,而 StringBuilder 串联操作仅当 StringBuilder 对象缓冲区太小而无法容纳新数据时才分配内存。因此,如果串联固定数量的 String 对象,则 String 类更适合串联操作。这种情况下,编译器甚至会将各个串联操作组合到一个操作中。如果串联任意数量的字符串,则 StringBuilder 对象更适合串联操作;例如,某个循环对用户输入的任意数量的字符串进行串联。
7、string和stringBuilder内的各个方法属性的使用