【大话String】P352
1.1【记忆】
1:String对象不以newobj指令创建,而是ldstr指令创建;
2:两次创建内容相同的String对象可以指向相同的内存地址(保存在托管堆中,相同的只是一个指向托管堆的地址。)
3:字符串恒等性(Immutability),是指字符串一经创建,就不可改变,对字符串的任何修改不会影响到原来的String对象,而是 重新创建String对象,这就可以解析substring方法了;(这样的方法:Insert,Substring,ToUpper等常用方法)
4:String对象从应用解读体现了值类型语义,而从内存角度实现为引用类型存储,位于托管堆;
5:恒等性一定程度上,成就了字符串驻留;
6:CLR内部维护了一个哈希表,来管理其创建的大部分string对象(散列表,这个大部分就包括动态生成的字符串);
7:string strD = strC + "def",(这个要注意,strD 是动态生成的字符串,好ibuhui被添加到哈希表中维护的);
8:手动启用字符串驻留:Intern,IsInterned;
9:Parse可以报异常,TryParse返回out的bool值,Conver为null时不会抛出异常,而是返回0;
10:string strPath = @"C:\",意思是把引号的内容都当成字符串,这样就不用转义操作了"\";在写正则表达式时经常使用这个;
11:按值传递和按引用传递(ref与out)(类似于在页面中使用DropDownList,把这个实例传递给后端,在后端直接设值,这个页面的ddl也是会改变的,当要给ddl设置一个树形的时候特别有用,因为很多地方都可能用到这个控件)
1.2【string和StringBuilder的性能对比】
1:在写代码的时候一直没有注意过这两者有什么不同,一般都是随着性子写的,一般使用StringBuilder都是使用它的Append和 AppendFormat来格式化字符串,其实string也是可以的,所以我一直没有关心过什么时候使用stirng,什么时候使用 StringBuilder。
2:本书给出的建议就是在进行大量循环的时候需要使用StringBuilder。
3:值得注意的是,在实例化StringBuilder的时候可以传递一个数值作为一个池(个人理解),书里面的描述就是容量,也就是StringBuilder所维护的字符数组的长度,默认的使用是16,可以根据需要来设置该值。
4:StringBuilder在使用上,最好指定合适的容量值。
1.3【实践】
1:Split方法很常用,就是用来分隔包括某个字符的字符串,并返回一个数组;
2:string s = String.Join(",",chars[]);类似这样的操作,刚好是跟上面的逆运算,用某个字符来组合数组的值,并返回一个字符串;
3:如果我们不想使用数组,而使用泛型,那就有自己写方法了;
4:Stepwath可以用来计算执行的时间,在性能测试的时候用得着;
5:StartsWith,EndsWith,这两个方法很有用,一个很经典的使用就是这样的业务逻辑,我们的系统中一般都有组织获取目录这样 的树形结构,而我们在设计数据库的时候通常都是使用字符串来表示这些编码,Code和他的父亲ParentCode,比如[001,0]; [001001,001];[001002,001];[001001001,001001];这样的记录,而如果我们要判断两条记录的关系,我们该如何 呢?有一个办法就是先判断这两个字符串长度是否相等,如果是,再判断是否相等;如果不是,再通过两个字符串一个个对比,这是一个很笨的方法,我以前就这么 笨过,看到这里,你已经猜到可以使用了StartsWith了,靠,代码美观了太多了。