字符、字符串 、格式化 、编码、解码 CLR学习第十一课 狼

一、char 字符类型(他是值类型,strcut):3种转换类型方法:1.(int)char。 2.convert.ToInt(

)。3.IConvertlble,该接口实现了大量的类型间转换操作,FCL中的数值类型都实现了该接口。
其公实现了:IComparable, IConvertible, IComparable<char>, IEquatable<char>几个接口。

二、所有直接继承只System.Object的类型都是引用类型。郁闷吧。System.ValueType居然是引用类型,所

有的值类型都是继承自它。

三、string(密封类)共实现 IComparable, ICloneable, IConvertible, IComparable<string>,

IEnumerable<char>, IEnumerable, IEquatable<string>几个接口。string字符串一旦被创建就不能改变

它的大小或者改变日子的任何字符串。对已经什么的字符串作改动,是生成了新的字符串,而不是修改了

原来的字符串,如使用substring处理字符串,原字符串并没有改变,用substring处理的字符串另外生成

了一个零时字符串,当处理结束GC就回收他。其实是字符串驻留技术。

四、不同国家字符串的排序是不同的,我们比较两个字符串时,如果使用的语言基础国家不统一会导致相

同的字符串比较会一时相等一时不相等。 我们用System.Thrinding.CompareInfo和

Sysetm.Globlization.ComareInfo来保证处理的语言方式位于同一个国家语句基础。

五、字符串驻留机制
String s="Hello";

    Console.WriteLine(Object.RefreneceEquals("Hello",s));返回的true。对是true!!!。
原因:CLR初始化时,他回创建一个内部散列表,其中的建为字符串,值为指向托管堆中字符串对象的引

用。刚开始,该表为空,当jit编译器编译方法是,他会在散列表中查找每一个问题常量字符串,对于上

面的代码首先会查找第一个Hello字符串,并且因为没有找到,他便会在托管堆中构造一个新的string对

象(指向该字符串),然后将Hello字符串和指向该对象的引用添加到散列表中。接着jit编译器在散列表

中查找第二个Hello字符串,这次由于汇找到该字符串,所以不会执行任何操作。当代码执行时,发现需

要一个Hello的字符串引用,于是clr在其内部散列表中查找Hello,并且会找到他,这样指向先前创建的

String对象的一样就被保存在变量s中。当执行的第二行代码时,clr会再次在其内部查找Hello,并且他

仍然会找到,于是执行同一个string对象的一样会被传递给object的静态RefreceneEquals,所以返回

true。

但是下面的代码将分别返回false、true;
string s1=“hello”;
string s2=“hel”;

string s3=s2+“lo”;
 Console.WriteLine(Object.RefreneceEquals(s1,s3))//false;
 Console.WriteLine(s1.Equals(s3));//true;
一个hello位于s1的托管堆,一个hello位于s3的托管堆,但他们的值相等。
返回false是因为动态创建的字符串并没有被添加到clr内部的散列表中。
返回true是因为两个字符串实际上奶表示着同样的字符集(如果s3=“hel”+“lo”,都将返回true)。
(Object.RefreneceEquals的效率比s1.Equals的效率高。

下面的代码将都返回true;
string s1=“hello”;
string s2=“hel”;

string s3=s2+“lo”;
s3=String.Intern
 Console.WriteLine(Object.RefreneceEquals(s1,s3))//false;
 Console.WriteLine(s1.Equals(s3));//true;

六、垃圾收集器不会释放CLR内部的散列表中引用的字符串对象,这写string对象的引用一直被散了表保

存着,只有当进程中的所有应用程序员(AppDomian)都不再犹豫这些字符串对象时,他们才会被释放,

因为字符串驻留是按进程为单位进行的,也就是说一个字符串可以被同一个进程的多个应用程序域访问,

这节省内存。

七、IsInterned,其在clr内部散列表中查找值:,如果clr内部散列表包含该字符串,IsInterned将返回

散列表中保存字符串对象的引用,否则返回null。

八、stringBulider:当我们向其追加字符串时,其会检测数值的增长是否超出了其容量,如果超出其容

量(默认容量是16字符,如字符是17则容量加倍为32--64--128-256这样进行翻倍,如果设置容量为100则

进行类似的2的倍数进行翻倍)字段加倍,并分配一个新的数组,然后将原来数组拷贝到新分配的数组中

,原数组被GC回收。

九、System.IFormattble接口实现类的提供格式后的字符串。该接口的TOstring方法接受2个参数,一个

是format是字符串,他告诉方法应该怎样来格式对象,第二个参数是fromatProvider是失效了

System.IFormatProvider接口的类型实例,该类型为ToSting方法提供了特定的语言文化信息。如果传递

了一个IFormattble接口不能识别的参数将抛出System.formtException异常。

十、DateTime:用d来表示段日期,D表示长日期,g表示常规日期/时间格式,M表示 月/日 ,s表示可排

序的日期/时间格式,T表示时间格式,u表示ISO860格式标准定义的通用时间格式,U表示长日期给在中通

用时间格式,Y表示年/月。
枚举:用G表示常规格式、F表示位标记格式,用D表示十进制,用X表示十六进制。

数值类型:用C表示货币格式化,D表搜十进制格式,E表示科学计算法,F表示定点格式,G表示常规格式,

N表示数字格式,P表示百分比格式,R表示回程格式。

复杂的上面不能满足的格式化可以用 图片格式字符串。格式字符串时,字符串参数null和G效果相同,

null即使用常规格式处理。

十一、操作字符串时,如果没有指定它的编码格式,将默认为UTF-8(UTF-表示Unicode转换格式,即

Unicode Transformation Format)的编码;UTF-8:可以被压缩; 还有UTF-16将16位的字符编码为2个字节

,无压缩,性能好。

十二、编解码类:System.Text.Encoding,其是一个抽象类。System.Text.Unicodeing、

System.Text.Utf9Encoding、System.Text.UTF7Encoding、System.Text.ASCIIEncoding,等几个类专门

用于编码格式的处理,他们都位于System.Text命名空间下,并且继承自类:System.Text.Encoding,类。

十三、Decoder类用于解码工作,也是抽象基类,在出现单数字节时,但下的字节被保存在解码器中,和后

面的一起进行解码。


 

原文地址:https://www.cnblogs.com/gowhy/p/2011031.html