• 字符、字符串 、格式化 、编码、解码 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类用于解码工作,也是抽象基类,在出现单数字节时,但下的字节被保存在解码器中,和后

    面的一起进行解码。


     

  • 相关阅读:
    Altium Designer的PCB定位槽制作
    J-LINK V8固件烧录指导
    简单实用的双向电平转换电路(3.3v-5v)
    Altium Designer 文档信息设置以及模板制作
    第十周作业
    第九周作业
    第8周作业作业
    第七周作业
    linux作业
    马哥教育第一阶段考试(月考)
  • 原文地址:https://www.cnblogs.com/gowhy/p/2011031.html
Copyright © 2020-2023  润新知